Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1137804
  • 博文数量: 254
  • 博客积分: 1242
  • 博客等级: 少尉
  • 技术积分: 1581
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-03 21:49
文章分类

全部博文(254)

文章存档

2017年(16)

2016年(4)

2013年(94)

2012年(140)

分类: Python/Ruby

2017-10-22 10:09:29

Python中__init__方法注意点
注意1、__init__并不相当于C#中的构造函数,执行它的时候,实例已构造出来了。


class A(object):
    def __init__(self,name):
        self.name=name
    def getName(self):
        return 'A '+self.name
当我们执行


1
a=A('hello')
时,可以理解为


a=object.__new__(A)
A.__init__(a,'hello')
即__init__作用是初始化已实例化后的对象。


注意2、子类可以不重写__init__,实例化子类时,会自动调用超类中已定义的__init__


class B(A):
    def getName(self):
        return 'B '+self.name
 
if __name__=='__main__':
    b=B('hello')
    print b.getName()
但如果重写了__init__,实例化子类时,则不会隐式的再去调用超类中已定义的__init__




class C(A):
    def __init__(self):
        pass
    def getName(self):
        return 'C '+self.name
 
if __name__=='__main__':
    c=C()
    print c.getName()
则会报"AttributeError: 'C' object has no attribute 'name'”错误,所以如果重写了__init__,为了能使用或扩展超类中的行为,最好显式的调用超类的__init__方法




class C(A):
    def __init__(self,name):
        super(C,self).__init__(name)
    def getName(self):
        return 'C '+self.name
 
if __name__=='__main__':
    c=C('hello')    
    print c.getName()

阅读(893) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~