python中类的使用及学习记录(三)

作者: laokou 分类: Python 发布时间: 2017-10-29 23:25
#这节学习类的继承
#----------------p1--------------------
class people:
    def __init__(self,which):
        self.which=which
    def printwhich(self):
        print(self.which)
class chinese(people):
    pass
me=people("yellow")
me.printwhich()
you=chinese("yellow")
you.printwhich()
print("由上面例子可以看出,对于继承而言,如果子类没有定义自己的构造函数,则调用父类的构造函数,且参数必须传入")
#----------------p2--------------------
class people:
    def __init__(self,which):
        self.which=which
    def printwhich(self):
        print(self.which)
class chinese(people):
    def __init__(self,where):
        self.where=where
    #def printwhich(self):
        #print(self.where)
me=people("china")
you=chinese("beijing")
me.printwhich()
try:
    you.printwhich()
except AttributeError:
    print("发生错误")
print("可以看出,如果子类拥有了新的构造方法,那么父类的构造方法不再使用")
print("这样会产生一个问题:想调用父类的方法时,如果这个方法含有父类的属性,则会报错")
print("当然,重新写那个方法是可以的,但无法调用原父类构造函数中的属性值")
print("所以,我们要保持父类的构造函数,确保其方法可行")
print("我们试一下")
#----------------p3--------------------
class people:
    def __init__(self,which):
        self.which=which
    def printwhich(self):
        print(self.which)
class chinese(people):
    def __init__(self,which,where):
        self.where=where
        self.which=which
you=chinese("yellow","beijing")
you.printwhich()
print("可以看出,如果完全复制父类的构造方法,复制原有属性,再添加自己的属性,调用父类的方法时是可行的,尽管子类中没有写该方法")
print("这种方法有一个问题,就是完全复制父类的构造方法到子类,包括其属性定义,比如上面的self.which=which")
print("否则无法找到原父类构造函数中的属性")
#----------------p4--------------------
print("如果属性过多,我们可以采取另外一种方法")
class people:
    def __init__(self,which):
        self.which=which
    def printwhich(self):
        print(self.which)
class chinese(people):
    def __init__(self,which,where):#先在构造函数里声明所有参数
        super(chinese,self).__init__(which) #所有父类构造函数中的参数传输一并解决,原父类保留
        self.where=where#增加子类新的属性
you=chinese("yellow","beijing")
you.printwhich()
#----------------p5--------------------
print("再试验另外一种方式")
class people:
    def __init__(self,which):
        self.which=which
    def printwhich(self):
        print(self.which)
class chinese(people):
    def __init__(self,which,where):#先在构造函数里声明所有参数
        people.__init__(self,which)#通过调用类的方式进行一次传输
        self.where=where
you=chinese("yellow","beijing")
you.printwhich()
print("不管哪种方式,在子类的构造函数定义时,参数要全传进来")
print("然后初始化,有两种方法")
print("所以,继承时应该初始化父类,因为父类的方法可能会用到父类构造函数中的属性。")

发表评论

电子邮件地址不会被公开。