Skip to content

Property and Iterator #12

Description

@eziceice

构造函数

  • 在Python3中将不会存在旧式类,所有的类都将隐式地继承object.

  • __init__是Python中的构造函数,它将会在函数创建后被自动调用.

class Test:
    def __init__(self, value=42):
        print('12345',value)

t = Test('kkk') #输出12345 kkk
  • 析构函数(destructor)的方法在Python中也被提供了,这个方法可以在对象被销毁前调用,但需要准确的知道调用时间,否则容易引起错误.
class Test:
    def __init__(self, value=42):
        print('12345',value)
    def __del__(self):
        print('123456')
t = Test('kkk') #输出12345 kkk 123456 - 说明t被销毁了
  • 覆盖重写子类的constructor的时候,必须先调用超类的constructor,否则有可能无法正确地初始化. 通常是使用super()方法,不过对于一些老版本的Python代码,也可以直接调用超类的constructor.
class Bird:
    def __init__(self):
        self.hungry = True
    def eat(self):
        if self.hungry:
            self.hungry = False
            print('I am Full now')
        else:
            print('I am not hungry')

class SongBird(Bird):
    def __init__(self):
        super().__init__()
        # Bird.__init__(self) 旧版方法-通过类调用方法,就不会有实例与其相关联,因此便可以随意设置参数self.
        # 这种方法调用的模式称为未关联方法调用.
s = SongBird()
s.eat()
s.eat()
  • 使用super()方法的优点是显而易见的. 即使一个类有多个超类,也只需要调用super()一次(条件是所有超类的构造函数也使用super).同时,super()将返回一个超类的对象(类似于包含所有超类的合集的对象),当你尝试去访问super()返回的对象的某个属性或者方法时,Python将会在所有的超类中进行查找,直到找到该属性或者引发AttributeError异常.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions