首页 > 编程语言 >任务12 面向对象编程方法进阶

任务12 面向对象编程方法进阶

时间:2022-11-25 15:45:14浏览次数:40  
标签:__ 12 进阶 self Person 面向对象编程 print class def

一、魔术方法

  • 以'__'包起来的方法
  • 魔术方法不需要调用就可以自动执行
  • 常用的四种魔术方法:__init__();__new__();__del__();__str__()

(1)__init__():

  • 初始化方法,类实例化时初始化对象
  • 无返回值
class Person:
    nose=1
    leg=2
    def __init__(self):
        self.nose=1
        self.leg=2
p1=Person()
print(p1.__dict__)

输出:{'nose': 1, 'leg': 2}

  • 传参(init括号里面为形参,self后面是对象的属性)
class Person:
    nose=1
    leg=2
    def __init__(self,name):
        self.name=name
        self.nose=1
        self.leg=2
p1=Person("六六六")
print(p1.__dict__)

输出:{'name': '六六六', 'nose': 1, 'leg': 2}

 

(2)__new__():

  • 实例化对象方法
  • 在实例化的时候触发
class Person:
    def __new__(cls):
        print("new方法被触发")
# 实例化对象
p1=Person()

输出:new方法被触发

  • 无返回值值时,实例化结果为None
  • 管理控制对象的生成
class Person:
    def __new__(cls):
        print("new方法被触发")
        return 1
# 实例化对象
p1=Person()
print(p1)

输出:

new方法被触发
1
  • 一个 cls 接收当前类,其他的参数根据实例化的参数决定
  • 实例化对象是 Object 类底层实现,其他类继承了 Object 的__new__ 才能够实现实例化对象
class Person:
    def __new__(cls,num):
        print(cls)
        if num=='1':
            return object.__new__(cls)
        else:
            return None
# 实例化对象
p1=Person('1')
print(p1)

输出:

<class '__main__.Person'>
<__main__.Person object at 0x00000287DF4CD5E0>

自己控制对象的生成,上面代码示例中,只有为1的时候才生成对象

(3)__del__():

  • 析构魔术方法
  • 当所有代码程序执行完成则会进行垃圾回收,也叫内存释放,这时就会触发__del__方法
class Person:
    def __del__(self):
        print("del方法被触发")
p1=Person()
print("*****")

输出:

*****
del方法被触发

  • 使用 del 对象名显示删除引用关系时,如果此操作将某块地址空间的最后一个引用关系给删除,会触发__del__方法
class Person:
    def __del__(self):
        print("del方法被触发")
p1=Person()
del p1
print("*****")

输出:

del方法被触发
*****

  • 使用完对象时回收资源,没有指针引用的时候会调用,绝大多数时候 不需要重写
  • 无返回值

(4)__str__():

  • 当print()时想看到更多信息时,可以重写__str__方法
  • 重写:用子类的方法覆盖父类的方法
  • 使用print()的时候触发
class Person:
    name='六六六'
    def __str__(self):
        print("str方法被触发")
        return self.name
p1=Person()
print(p1)

输出:

str方法被触发
六六六

注意:返回值必须是字符串类型

  • 使用str()的时候触发
class Person:
    name='六六六'
    def __str__(self):
        print("str方法被触发")
        return self.name
p1=Person()
str(p1)
print("*****")

输出:

str方法被触发
*****

  • 作用:print()时可以自定义输出更多有用信息

 二·、继承和多态

1、继承

  • 继承允许我们定义继承另一个类的所有方法和属性
  • 父类:继承的类
  • 子类:从另一个类继承的类
  • 单继承:一个子类只继承了一个父类。
class Person:
    def sing(self):
        print("唱歌...")
class Boy(Person):
    pass
b1=Boy()
b1.sing()

输出:唱歌...

子类中虽然没有sing函数,但是它继承了父类,可以直接调用

要给上面程序中添加一个其他方法时,该如何写呢,是在子类中添加还是父类中添加呢?实际上是都可以的

有多个子类的时候,要想让子类特有某个方法,这时需要添加到子类中去

代码示例:

class Person:
    def sing(self):
        print("%s唱歌..."%self.name)

    def __init__(self, name,age):
        self.name=name
        self.age = age
class Boy(Person):
    pass
class Girl(Person):
    def dance(self):
        print("%s跳舞..."%self.name)
b1=Boy("六六六",6)
b1.sing()
g1=Girl("七七七",7)
g1.dance()

输出:

六六六唱歌...
七七七跳舞...

  • 多继承:一个子类继承多个父类

格式:单继承在类()中写1个父类的名字,多继承在()中写多个父类名字,用","隔开

多继承使定义子类的功能更加灵活

class Person:
    def sing(self):
        print("唱歌...")
class Child:
    def dance(self):
        print("跳舞...")
class Boy(Person,Child):
   pass
b1=Boy()
b1.sing()
b1.dance()

输出:

唱歌...
跳舞...

2、重写

  • 有时发现子类继承的父类的方法不能完全满足子类对象的需求,则此时就需要在子类中定义一个与父类相同的名字的方法
  • 重写是子类中定义了与父类名字相同的方法
  • 会优先去子类中找,子类中没有找到才会去父类
class Person:
    def sing(self):
        print("唱歌...")
    def dance(self):
        print("跳舞...")
class Child(Person):
    def sing(self):
        print("唱唱唱...")
p1=Person()
p1.sing()
c1=Child() c1.sing()

输出:

唱歌...
唱唱唱...

3、super方法

  • 在子类重写的方法中通过调用父类中被重写的方法
  • super().父类方法名()
  • 可以调用父类中的方法名
class Person:
    def sing(self):
        print("%s唱歌..."%self.name)
    def dance(self):
        print("%s跳舞..."%self.name)
    def __init__(self, name):
        self.name = name
class Child(Person):
    def sing(self):
        super().sing()
        print("%s唱唱唱..."%self.name)
p1=Person("六六六")
p1.sing()
c1=Child("七七七")
c1.sing()

输出:

六六六唱歌...
七七七唱歌...
七七七唱唱唱...

4、多态

  • 字面理解就是多种形态
  • 实现多态前提:继承和重写
  • 作用:增加程序灵活性、增加程序可扩展性
class Person():
    def demo(self):
        print("六六六")
class Child(Person):
    def demo(self):
        print("七七七")
class Boy(Person):
    def demo(self):
        print("八八八")
def func(obj):
 obj.demo()
if __name__ == "__main__":
    c1=Child()
    b1 = Boy()
    func(c1)
    func(b1)

输出:

七七七
八八八

 

 

 

疑问:

多继承的时候可以这样写吗?

class Person:
    def sing(self):
        print("唱歌...")
class Child(Person):
    def dance(self):
        print("跳舞...")
class Boy(Person,Child):
   pass
c1=Child()
c1.sing()
b1=Boy()
b1.sing()
b1.dance()

结果:程序报错

解决:修正后代码如下(将Person与Child交换一下位置)

class Person:
    def sing(self):
        print("唱歌...")
class Child(Person):
    def dance(self):
        print("跳舞...")
class Boy(Child,Person):
   pass
c1=Child()
c1.sing()
b1=Boy()
b1.sing()
b1.dance()

输出:

唱歌...
唱歌...
跳舞...

原因:类Boy想要继承Person和Child,由于Child已经继承Person了,写成class Boy(Person,Child)错误形式时,python无法确定先查找哪些类的方法,于是无法覆盖定义在Person中定义的方法。

 

标签:__,12,进阶,self,Person,面向对象编程,print,class,def
From: https://www.cnblogs.com/0925-LFH/p/16924746.html

相关文章

  • 【iOS-Cocos2d游戏开发之十八】解决滚屏背景/拼接地图有黑边(缝隙)/动画播放出现毛边
    ​​ 李华明Himi ​​​原创,转载务必在明显处注明​   本章节主要为大家介绍在游戏开发过程中经常遇到的两个问题;   1.解决滚屏背景或拼接地图有黑边!   ......
  • 【Python】第4章-12 求满足条件的斐波那契数
    斐波那契数,亦称之为斐波那契数列,指的是这样一个数列:1、1、2、3、5、8、13、21、……,这个数列从第3项开始,每一项都等于前两项之和。求大于输入数的最小斐波那契数。输入格......
  • 012:前端学习-CSS动画
    CSS动画动画是使元素从一种样式逐渐变化为另一种样式的效果您可以改变任意多的样式任意多的次数请用百分比来规定变化发生的时间,或用关键词"from"和"to",等同于0%和100%0%......
  • 【iOS开发必收藏】详解iOS应用程序内使用IAP/StoreKit付费、沙盒(SandBox)测试、创建测
     Himi 原创,欢迎转载,转载请在明显处注明!谢谢。//——2012-12-11日更新 获取"产品付费数量等于0这个问题"的原因看到很多童鞋问到,为什么每次都返回数量等于0??其实有童......
  • 【转】Android 12.0蓝牙适配
    原文网址:Android12.0蓝牙适配-掘金(juejin.cn)前言  在我的申请下,公司终于购买了一台基于Android12.0的手机,然后我就开心的拿去安装测试了,发现程序崩溃了,于是我......
  • LeetCode 912.排序数组
    题目描述:给你一个整数数组 nums,请你将该数组升序排列。示例1:输入:nums= [5,2,3,1]输出:[1,2,3,5]示例2:输入:nums= [5,1,1,2,0,0]输出:[0,0,1,1,2,5]提示:1. 1 <= nums......
  • Java 通过IDEA连接sqlserver2012数据库
    1、官网下载sqlserver的jdbc在这里下载:http://www.microsoft.com/zh-cn/download/details.aspx?id=117744.0版本支持的 SQLServer有:Microsoft®SQLServer®2012Mi......
  • maven的进阶内容
     四、  三、继承1、2、34、  二、聚合1)创建一个module,用来专门管理各个模块之间的依赖配置等关系2)把pom文件中的打包方式修改为pom;(每个maven工程都有对......
  • GEE|Google Earth Engine报错Error in map(ID=LC08_123038_20190121) Element.copyPro
    本文以LANDSAT/LC08/C01/T1_SR数据集为例介绍Thesourceparameterisrequire应该如何解决。问题描述GEE平台提供了影像在线处理,在完成对数据集处理后,想要对数据进行......
  • MySQL进阶实战3,mysql索引详解,上篇
    一、索引索引是存储引擎用于快速查找记录的一种数据结构。我觉得数据库中最重要的知识点,就是索引。存储引擎以不同的方式使用B-Tree索引,性能也各有不同,各有优劣。例如MyI......