Python的Object基类的__init__方法

Python的Object基类的__init__方法


Python的__init__方法是用来初始化的实例的,是在__new__()方法执行后但是还没有return的情况下执行的__init__()方法。__new__()方法是用来创建实例的。这个__init__类似于构造方法,是可以直接从object类中继承的。如果一个BaseClass有__init__()方法,那么他的派生类(子类)需要显示的执行这个方法,不然是无法初始化BaseClass类的属性。__init__()方法是没有返回值的,并且如果有除了self意外的参数的话,在调用时是需要指定的

创建类:

class Mytest1:
    def __init__(self,value):
        self._value = value
        self._children = []
    
    def myprint(self):
        print('You point value : ',self._value)


if __name__ == '__main__':
    t = Mytest1(1)    
    t.myprint()


输出:

You point value :  1

如果此时在实例化Mytest1时没有将value这个参数指定值,那么就会报错:

Traceback (most recent call last):
  File "E:\workspace\mystudy\com\dgb\object\myinit.py", line 17, in
    t = Mytest1()    
TypeError: __init__() missing 1 required positional argument: 'value'

在父类和子类的环境中:

class Mytest1:
    def __init__(self,value):
        self._value = value
        self._children = []
    
    def myprint(self):
        print('You point value : ',self._value)
        
class Mysubtest1(Mytest1):
    def __init__(self,value,value1):
        Mytest1.__init__(self,value)
        self._value1 = value1
    
    def myprint1(self):
        print('sub class _value1 : ',self._value1)
        print('base class _value : ',self._value)   
if __name__ == '__main__':
    t = Mytest1(1)    
    t.myprint()   
    ts = Mysubtest1(1,10)
    ts.myprint1()

如果在Mysubtest1中init方法中没有调用父类的init方法的情况下是无法访问Mytest1中的_value属性的:

Traceback (most recent call last):
  File "E:\workspace\mystudy\com\dgb\object\myinit.py", line 30, in
    ts.myprint1() 
  File "E:\workspace\mystudy\com\dgb\object\myinit.py", line 23, in myprint1
    print('base class _value : ',self._value)   
AttributeError: 'Mysubtest1' object has no attribute '_value'

Python3.4版本中文档:

object. __init__ ( self [, ... ] )

Called after the instance has been created (by __new__()), but before it is returned to the caller. The arguments are those passed to the class constructor expression. If a base class has an__init__() method, the derived class’s__init__() method, if any, must explicitly call it to ensure proper initialization of the base class part of the instance; for example: BaseClass.__init__(self,[args...]).

Because __new__() and __init__() work together in constructing objects (__new__() to create it, and __init__() to customise it), no non-None value may be returned by__init__(); doing so will cause aTypeError to be raised at runtime


开始系统的学习Python,从底层开始,夯实基础啊。一点一点积累。






你可能感兴趣的:(Python)