大家好,欢迎来到IT知识分享网。
类的继承
继承的概念:类的继承是面向对象编程中的重要概念,它允许我们创建一个新类,该类继承了一个或多个现有类的属性和方法。
子类和父类的概念
class ChildClass(ParentClass): # 子类的属性和方法
ChildClass 子类的名称
ParentClass 父类的名称
子类将继承父类的所有属性和方法,并且可以添加自己的属性和方法。
子类可以覆盖父类的方法和属性,这意味着子类可以重新定义一个父类相同名称的方法和属性,可以使子类在需要时修改父类的行为
注意点:父类中的私有属性不能继承
具体例子:
#定义一个Woman类 class Woman: # 该类的共有属性 gender="女" # 共有属性,不同个体有所不同(对象的实例化过程)height=160 默认参数 def __init__(self,age=18,character="干净利落",education="本科",height=160,eat="牛排"): ''' age:年龄 height:身高 character:性格 education:学历 ''' self.age=age self.height=height self.character=character self.education=education self.eat=eat @property def play(self): self.plays="游玩的地方" print("这是喜欢游玩的地方") @classmethod def eat01(cls): print(cls.gender) pass print("这是喜欢吃的食物") @staticmethod def scenery(): print("这是凤凰岭风景区") def work(self,name,works,hobby): self.score=100 #类,方法之间的调用 self.eat01() print("{0}女士,拥有{1}学历,性格{2},在{3}工作~,她的爱好{4},嘿嘿!我还知道她喜欢吃{5}".format(name, self.education, self.character, works,hobby,self.eat)) #定义一个时尚的女人对象 class FashionWoman(Woman): def fashion_outfit(self,name,attire,bag): print("{}女士,是个时尚的人,经常身穿{},背着{},看起来很时尚".format(name,attire,bag)) if __name__ == '__main__': #FashionWoman 子类,继承了父类 Woman ,传值时,需要同Woman一致 Lina = FashionWoman().fashion_outfit("小李","酷炫","运动") print(Lina) Lan = FashionWoman(22, "luoluodafang", "本科").fashion_outfit("小丽", "港风", "LV") print(Lan) #子类调用父类的work方法 Li = FashionWoman().work("小张",works="中国联通",hobby="榴莲")
输出结果:
子类继承了父类,子类就可以调用父类的所有属性和方法
子类定义的方法,父类不能调用子类的方法,继承是单向的,子类继承父类
具体调用如下:
fashion_outfit 是 FashionWoman 子类定义的方法
2、子类可以自己定义 __init__ 实类属性
当 子类 与 父类 存在相同的 属性名和方法名时,相同的属性和方法,父类使用父类的,子类使用子类的,子类不能再使用父类的。
要点:子类覆盖父类的方法,即为 重写
具体例子如下:
class Woman: # 该类的共有属性 gender="女" # 共有属性,不同个体有所不同(对象的实例化过程)height=160 默认参数 def __init__(self,age=18,character="干净利落",education="本科",height=160,eat="牛排"): ''' age:年龄 height:身高 character:性格 education:学历 ''' self.age=age self.height=height self.character=character self.education=education self.eat=eat @property def play(self): self.plays="游玩的地方" print("这是喜欢游玩的地方") @classmethod def eat01(cls): print(cls.gender) pass print("这是喜欢吃的食物") @staticmethod def scenery(): print("这是凤凰岭风景区") def work(self,name,works,hobby): self.score=100 #类,方法之间的调用 self.eat01() print("{0}女士,拥有{1}学历,性格{2},在{3}工作~,她的爱好{4},嘿嘿!我还知道她喜欢吃{5}".format(name, self.education, self.character, works,hobby,self.eat)) #时尚的女人 class FashionWoman(Woman): #给 FashionWoman 定义属于自己的实类属性 def __init__(self,age,name): self.age = age self.name = name def fashion_outfit(self,name,attire,bag): print("{}女士,是个时尚的人,经常身穿{},背着{},看起来很时尚".format(name,attire,bag)) #定义属于自己的work 方法 def work(self): print("我们每天都应该好好的工作,这个是{}说的,她也只有{}岁".format(self.name,self.age)) return self.name,self.age if __name__ == '__main__': #FashionWoman 实类属性只能使用自己的 Lina = FashionWoman(name="Lina",age=12).fashion_outfit("小李","酷炫","运动") print(Lina) Lan = FashionWoman(22, "luoluodafang").fashion_outfit("小丽", "港风", "LV") print(Lan) # 调用Woman的方法报错 # Li = FashionWoman().work("小张",works="中国联通",hobby="榴莲") # print(Li) #FashionWoman 实类属性只能使用自己的,work方法也使用自己的 Nan = FashionWoman(name="Lina",age=12).work() print(Nan)
原有 FashionWoman 的调用 Woman 的 work方法 报错
3、两层继承,子类没有的方法,可以找父类的父类(也就是,可以调用上上级的方法)
具体例子:
class Pepole: # 定义类属性 eye="黑色" toufa="黑色" pifu="黄色" def shuxing_01(self, username): self.username = username '判断属性的方法' self.shuxing = input("请输入你的性别,我们鉴定你的属性:") if self.shuxing == "男": print("你是大帅哥") elif self.shuxing == "女": print("你是大美女") else: print("请从新审视你的性别,谢谢") s = "{0}你好,我们将会保存你的属性类别为:{1}".format(self.username, self.shuxing) print(s) #Woman 的父类 Pepole class Woman(Pepole): # 该类的共有属性 gender="女" # 共有属性,不同个体有所不同(对象的实例化过程)height=160 默认参数 def __init__(self,age=18,character="干净利落",education="本科",height=160,eat="牛排"): ''' age:年龄 height:身高 character:性格 education:学历 ''' self.age=age self.height=height self.character=character self.education=education self.eat=eat @property def play(self): self.plays="游玩的地方" print("这是喜欢游玩的地方") @classmethod def eat01(cls): print(cls.gender) pass print("这是喜欢吃的食物") @staticmethod def scenery(): print("这是凤凰岭风景区") def work(self,name,works,hobby): self.score=100 #类,方法之间的调用 self.eat01() print("{0}女士,拥有{1}学历,性格{2},在{3}工作~,她的爱好{4},嘿嘿!我还知道她喜欢吃{5}".format(name, self.education, self.character, works,hobby,self.eat)) #时尚的女人 class FashionWoman(Woman): def __init__(self,age,name): self.age = age self.name = name def fashion_outfit(self,name,attire,bag): print("{}女士,是个时尚的人,经常身穿{},背着{},看起来很时尚".format(name,attire,bag)) def work(self): print("我们每天都应该好好的工作,这个是{}说的,她也只有{}岁".format(self.name,self.age)) return self.name,self.age if __name__ == '__main__': #FashionWoman 调用父类的父类的方法 Loo = FashionWoman(name="Lina",age=12).shuxing_01("用户的姓名:LOO") print(Loo) 输出结果: 请输入你的性别,我们鉴定你的属性:女 你是大美女 用户的姓名:LOO你好,我们将会保存你的属性类别为:女 None
4、super() 函数 超继承,不需要传参数
使用父类当中的方法,简化父类方法调用的过程
super() 函数只能是调用父类的方法 (不能越级调用父类的父类)
super()函数 表示想用父类的所有方法(类方法、实例方法、静态方法),代表的就是一个对象或者类
总结:
1、super() 子类使用super()函数,继承父类的方法,如果父类的方法里是传参数的,子类方法也要正常传参数
具体的使用方式:
class Woman(Pepole): # 该类的共有属性 gender="女" # 共有属性,不同个体有所不同(对象的实例化过程)height=160 默认参数 def __init__(self,age=18,character="干净利落",education="本科",height=160,eat="牛排"): ''' age:年龄 height:身高 character:性格 education:学历 ''' self.age=age self.height=height self.character=character self.education=education self.eat=eat @property def play(self): self.plays="游玩的地方" print("这是喜欢游玩的地方") @classmethod def eat01(cls): print(cls.gender) pass print("这是女生都喜欢吃的食物") @staticmethod def scenery(): print("这是凤凰岭风景区") def work(self,name,works,hobby): self.score=100 #类,方法之间的调用 self.eat01() print("{0}女士,拥有{1}学历,性格{2},在{3}工作~,她的爱好{4},嘿嘿!我还知道她喜欢吃{5}".format(name, self.education, self.character, works,hobby,self.eat)) #时尚的女人 class FashionWoman(Woman): def __init__(self,age,name): self.age = age self.name = name def fashion_outfit(self,name,attire,bag): print("{}女士,是个时尚的人,经常身穿{},背着{},看起来很时尚".format(name,attire,bag)) def work(self): #父类方法的调用 Woman 的 eat01 方法 super().eat01() print("我们每天都应该好好的工作,这个是{}说的,她也只有{}岁".format(self.name,self.age)) return self.name,self.age if __name__ == '__main__': #调用 Nan = FashionWoman(name="Lina",age=12).work() print(Nan) #输出结果 女 这是女生都喜欢吃的食物 我们每天都应该好好的工作,这个是Lina说的,她也只有12岁 ('Lina', 12)
super()函数 表示想用父类的所有方法(类方法、实例方法、静态方法),代表的就是一个对象或者类
class FashionWoman(Woman): def __init__(self,age,name): self.age = age self.name = name #调用父类的实类方法 super().__init__() def fashion_outfit(self,name,attire,bag): print("{}女士,是个时尚的人,经常身穿{},背着{},看起来很时尚".format(name,attire,bag)) def work(self): #调用父类的eat01方法 super().eat01() #调用父类的work方法 super().work(name="lanlan",works="baidu",hobby="xuexi") print("我们每天都应该好好的工作,这个是{}说的,她也只有{}岁".format(self.name,self.age)) return self.name,self.age if __name__ == '__main__': Nan = FashionWoman(name="Lina",age=12).work() print(Nan) #输出结果 女 这是女生都喜欢吃的食物 lanlan女士,拥有本科学历,性格干净利落,在baidu工作~,她的爱好xuexi,嘿嘿!我还知道她喜欢吃牛排 我们每天都应该好好的工作,这个是Lina说的,她也只有18岁
拓展知识
动态获取属性: getattr () 内置函数,用于动态返回一个对象属性值
getattr()的源码
入参解释:
object 对象
name 字符串,对象属性
default 默认返回值,如果不提供该参数,在没有对应属性时,将触发 AttributeError
动态获取对象属性
具体例子如下:
class FashionWoman(Woman): def __init__(self,age=18,name="蓝庭旭"): self.age = age self.name = name super().__init__() def fashion_outfit(self,name,attire,bag): print("{}女士,是个时尚的人,经常身穿{},背着{},看起来很时尚".format(name,attire,bag)) def work(self): super().eat01() super().work(name="lanlan",works="baidu",hobby="xuexi") print("我们每天都应该好好的工作,这个是{}说的,她也只有{}岁".format(self.name,self.age)) return self.name,self.age #方法调用 if __name__ == '__main__': AA = FashionWoman() print(getattr(AA,"name")) #结果输出 蓝庭旭
动态设置属性 :setattr()内置函数,设置的属性就存在了,可以访问
具体例子如下:
class FashionWoman(Woman): def __init__(self,age=18,name="蓝庭旭"): self.age = age self.name = name super().__init__() def fashion_outfit(self,name,attire,bag): print("{}女士,是个时尚的人,经常身穿{},背着{},看起来很时尚".format(name,attire,bag)) def work(self): super().eat01() super().work(name="lanlan",works="baidu",hobby="xuexi") print("我们每天都应该好好的工作,这个是{}说的,她也只有{}岁".format(self.name,self.age)) return self.name,self.age if __name__ == '__main__': #属性的设置 AA = FashionWoman() print(getattr(AA,"name")) print(setattr(AA,"color","red")) print(AA.color) #输出结果 蓝庭旭 None red
总结:
getattr() : 1、动态获取属性(已经存在的) 2、动态设置时,不存在的属性,返回默认值
setattr() : 动态设置不存在的属性,设置完该属性,该属性就会存在,可以进行访问.
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/30824.html