JokerShame 发表于 2022-3-20 17:30

python基础教程总结分享——魔法方法

本帖最后由 JokerShame 于 2022-3-20 17:34 编辑

在Python中,有些名称很特别,开头和结尾都是两个下划线。在这样的名称中,很大一部分都是魔法(特殊)方法的名称。如果你的对象实现了这些方法,它们将在特定情况下(具体是哪种情况取决于方法的名称)被Python自动调用。

1、构造函数
构造函数即创建示例时使用的初始化方法,命名为__init__。构造函数不同于普通方法的地方在于,将在对象创建后自动调用。
例如:
class Car:
    def __init__(self):
      self.name = 'Audi A6'


>>>f = Car()
>>>print(f.name)
Audi A6

2、继承
子类可以从其超类中继承方法,对子类的实例调用方法(或访问其属性)时,如果找不到该方法(或属性),将在其超类中查找。要在子类中定制继承而来的行为,使其与超类的对应方法不同,对于普通方法,直接重写即可。但重写构造函数时,必须同时调用一遍超类的构造函数,否则可能无法正确地初始化对象。
例如:
class Bird:
    def __init__(self):
      self.hungry = True
    def eat(self):
      if self.hungry:
            print("Eating...")
            self.hungry = False
      else:
            print("No, thanks.")


>>>b = Bird()
>>>b.eat()
Eating...
>>>b.eat()
No, thanks.

这时候,如果创建的Bird的子类没有调用Bird的构造函数的话,子类在调用涉及到超类初始化的属性时就会报错
class Bird:
    def __init__(self):
      self.hungry = True
    def eat(self):
      if self.hungry:
            print("Eating...")
            self.hungry = False
      else:
            print("No, thanks.")


class SongBird(Bird):
    def __init__(self):
      self.sound = 'Squawk!'
    def sing(self):
      print(self.sound)


>>>sparrow = SongBird()
>>>sparrow.sing()
Squawk!
>>>sparrow.eat()
Traceback (most recent call last):
File "xxx", line 21, in <module>
    sparrow.eat()
File "xxx", line 5, in eat
    if self.hungry:
AttributeError: 'SongBird' object has no attribute 'hungry'

子类的构造函数调用超类的构造函数有两种方法:调用未关联的超类构造函数,或者使用函数super。

调用未关联的超类构造函数:
class SongBird(Bird):
    def __init__(self):
      Bird.__init__(self)
      self.sound = 'Squawk!'
    def sing(self):
      print(self.sound)


>>>sparrow = SongBird()
>>>sparrow.sing()
Squawk!
>>>sparrow.eat()
Eating...
>>>sparrow.eat()
No, thanks.
如上,只需要在子类中添加一行,Bird.__init__(self)。这样做为什么管用呢,对实例调用方法时,方法的参数self将自动关联到实例(称为关联的方法)。然而如果通过类调用方法(如Bird.__init__),就没有实例与其相关联。在这种情况下,你可随便设置参数self。这样的方法称为未关联的。通过将这个未关联方法的self参数设置为当前实例,将使用超类的构造函数来初始化这个实例。

使用函数super:
调用函数super时,将当前类和当前实例作为参数。对其返回的对象调用方法时,调用的将是超类的方法。因此,在SongBird的构造函数中,可不使用Bird,而是使用super(SongBird,self),在python3中调用函数super时,可不提供任何参数。
例如:
class Bird:
    def __init__(self):
      self.hungry = True
    def eat(self):
      if self.hungry:
            print("Eating...")
            self.hungry = False
      else:
            print("No, thanks.")


class SongBird(Bird):
    def __init__(self):
      super().__init__()
      self.sound = 'Squawk!'
    def sing(self):
      print(self.sound)

>>>sparrow = SongBird()
>>>sparrow.sing()
Squawk!
>>>sparrow.eat()
Eating...
>>>sparrow.eat()
No, thanks.

kongkongruye 发表于 2022-3-21 21:53

JokerShame 发表于 2022-3-21 19:35
可行啊,我有同学公司就专门给他们培训用Python处理表格进行数据分析,Python适合搞这个的

已转达,太感谢了!本来以为一个做财务的,怎么可能跨行搞编程呢,这回,可以坚定他学习信心了!

kongkongruye 发表于 2022-3-21 21:55

genius_7321 发表于 2022-3-21 01:29
做数据分析当然可以了,不过还是得看掌握程度了

感谢指点!{:1_893:}已转达。我想,他的想法就是把EXCEL中不好处理的大量数据分析、图形化展示用编程语言来实现,这是不是算是基础应用了

大方 发表于 2022-3-20 20:41

蟹蟹分享,学习了

shawn9527 发表于 2022-3-20 21:42

python好学吗?我也想去学习学习了

JokerShame 发表于 2022-3-20 22:56

shawn9527 发表于 2022-3-20 21:42
python好学吗?我也想去学习学习了

单说语言的话是挺简单的,不过Python封装的有很多很多库,这个就需要多用多练去掌握了。我也是刚开始学,了解的不全面。

gdgyf 发表于 2022-3-20 22:57

大神!学习贴,正好有用,感谢!!!

JokerShame 发表于 2022-3-20 23:03

gdgyf 发表于 2022-3-20 22:57
大神!学习贴,正好有用,感谢!!!

我是萌新;www共同学习,共同进步嗷:handshake

kongkongruye 发表于 2022-3-20 23:25

请教:我朋友做财务的,想学习Python替代EXCEL做数据分析,可行么?{:1_893:}

yqwangjie 发表于 2022-3-20 23:40

小白学习啦

genius_7321 发表于 2022-3-21 01:29

kongkongruye 发表于 2022-3-20 23:25
请教:我朋友做财务的,想学习Python替代EXCEL做数据分析,可行么?

做数据分析当然可以了,不过还是得看掌握程度了

LimpidLuster 发表于 2022-3-21 09:09

谢谢分享,学习了
页: [1] 2
查看完整版本: python基础教程总结分享——魔法方法