Python 类与继承/父类属性、方法的扩展

一、属性继承与方法继承

class Person(object):

    def __init__(self,name,age,sex):
        self.name = name
        self.age = age
        self.sex = sex
        self.desc = 人

    def run(self):
        print({}岁的{}正在跑步.format(self.age,self.name))
        

class Men(Person):
    pass
    

xm = Men(小明,18,男)
xm.run()
print(xm.sex)
print(xm.desc)

运行结果:

18岁的小明正在跑步
男
人

说明:子类默认继承父类的属性和方法(所有的类均继承自object,自python3后可省略不写)。

二、重写与覆盖

class Person(object):
    
    def __init__(self,name,age,sex):
        self.name = name
        self.age = age
        self.sex = sex
        self.desc = 人
        
    def run(self):
        print({}岁的{}正在跑步.format(self.age,self.name))
        

class Men(Person):
    
    def __init__(self,hight):
        self.hight = hight
        
    def run(self):
        print(18岁的小明正在疯狂地跑步)
    

xm = Men(182)
xm.run()
print(xm.desc)

运行结果:

18岁的小明正在疯狂地跑步
Traceback (most recent call last):
  File "C:/Users/Administrator/Desktop/9999.py", line 24, in <module>
    print(xm.desc)
AttributeError: Men object has no attribute desc

说明:子类中的__init__、run方法均重写,会覆盖掉本可以从父类继承过来的方法,且重写__init__方法后无法调用父类的静态属性了。

三、类的属性、方法的扩展(本质还是重写与覆盖)

class Person(object):
    
    def __init__(self,name,age,sex):
        self.name = name
        self.age = age
        self.sex = sex
        self.desc = 人
        
    def run(self):
        print({}岁的{}正在跑步.format(self.age,self.name))
        

class Men(Person):
    
    def __init__(self,name,age,sex,hight):
        super(Men,self).__init__(name,age,sex)
        # super().__init__(name,age,sex) 效果同上
        # Person.__init__(self,name,age,sex) 效果同上上 
        self.hight = hight

    def run(self):
        super(Men,self).run()
        # super().run() 效果同上
        # Person.run(self) 效果同上上 
        print(我是重写的run方法)

xm = Men(小明,18,男,182)
xm.run()
print(xm.desc)

运行结果:

18岁的小明正在跑步
我是重写的run方法
人

说明:Men类的__init__方法可以在父类的基础上添加额外的属性,run方法可以在父类的基础上添加额外的逻辑;在子类的run方法中使用super(Men,self).run()调用父类方法后,可以实现类似于在父类方法的基础上添加额外逻辑的效果。

经验分享 程序员 微信小程序 职场和发展