类的继承
类的继承
class Person(object): # 定义一个父类 def talk(self): # 父类中的方法 print("person is talking....") class Chinese(Person): # 定义一个子类, 继承Person类 def walk(self): # 在子类中定义其自身的方法 print('is walking...') c = Chinese() c.talk() # 调用继承的Person类的方法 c.walk() # 调用本身的方法 # 输出 person is talking.... is walking...
构造函数的继承
如果我们要给实例 c 传参,我们就要使用到构造函数,那么构造函数该如何继承,同时子类中又如何定义自己的属性?
继承类的构造方法:
1.经典类的写法: 父类名称.__init__(self,参数1,参数2,...)
2. 新式类的写法:super(子类,self).__init__(参数1,参数2,....)
class Person(object): def __init__(self, name, age): self.name = name self.age = age self.weight = 'weight' def talk(self): print("person is talking....") class Chinese(Person): def __init__(self, name, age, language): # 先继承,在重构 Person.__init__(self, name, age) #继承父类的构造方法,也可以写成:super(Chinese,self).__init__(name,age) self.language = language # 定义类的本身属性 def walk(self): print('is walking...') class American(Person): pass c = Chinese('bigberg', 22, 'Chinese')
super()继承父类
如果要在子类中引用父类的方法,但是又需要添加一些子类所特有的内容,可通过类名.方法()和super()来调用父类的方法,再个性化子类的对应函数。
直接使用类名.方法()来调用时,还是需要传入self为第一个参数,而使用super()调用则python自动将self传入,因此使用super()比较简洁。
如下animal基类和cat子类,cat类的__init__( )构造函数比父类多一个leg参数,eat()函数比父类多一行输出,通过super()调用父类的函数,则不需要将重复的部分再写一遍。
使用super()调用父类函数的好处:
1.简化代码
2.如果父类名称修改,对其他调用父类函数的类来说也没有影响,而如果直接使用父类的名称来调用,父类名称修改会影响其他所有的类。
class animal: def __init__(self,name,sex,leg): self.name = name self.sex = sex self.leg = leg def eat(self,food): print('%s likes to eat %s'%(self.name,food)) class cat(animal): #cat类继承animal类 def __init__(self,name,sex,leg,tail): #定义初始化构造函数,但是比父类多一个参数 #animal.__init__(self,name,sex,leg) super().__init__(name,sex,leg) #调用父类的初始化构造函数 self.tail=tail print('cat has %s legs,and %s tail'%(self.leg,self.tail)) def eat(self,food): #定义eat函数,但是增加一行输出 #animal.eat(self,food) super().eat(food) #调用父类的方法 print('%s also likes to eat %s' % (self.name, food)) cat1=cat('cat1','male',4,1) cat1.eat('mouse') # 输出如下: # cat has 4 legs,and 1 tail # cat1 likes to eat mouse # cat1 also likes to eat mouse
子类对父类方法的重写
class Person(object): def __init__(self, name, age): self.name = name self.age = age self.weight = 'weight' def talk(self): print("person is talking....") class Chinese(Person): def __init__(self, name, age, language): Person.__init__(self, name, age) self.language = language print(self.name, self.age, self.weight, self.language) def talk(self): # 子类 重构方法 print('%s is speaking chinese' % self.name) def walk(self): print('is walking...') c = Chinese('bigberg', 22, 'Chinese') c.talk() # 输出 bigberg 22 weight Chinese bigberg is speaking chinese
事例:
class SchoolMember(object): '''学习成员基类''' member = 0 def __init__(self, name, age, sex): self.name = name self.age = age self.sex = sex self.enroll() def enroll(self): '注册' print('just enrolled a new school member [%s].' % self.name) SchoolMember.member += 1 def tell(self): print('----%s----' % self.name) for k, v in self.__dict__.items(): print(k, v) print('----end-----') def __del__(self): print('开除了[%s]' % self.name) SchoolMember.member -= 1 class Teacher(SchoolMember): '教师' def __init__(self, name, age, sex, salary, course): SchoolMember.__init__(self, name, age, sex) self.salary = salary self.course = course def teaching(self): print('Teacher [%s] is teaching [%s]' % (self.name, self.course)) class Student(SchoolMember): '学生' def __init__(self, name, age, sex, course, tuition): SchoolMember.__init__(self, name, age, sex) self.course = course self.tuition = tuition self.amount = 0 def pay_tuition(self, amount): print('student [%s] has just paied [%s]' % (self.name, amount)) self.amount += amount t1 = Teacher('Wusir', 28, 'M', 3000, 'python') t1.tell() s1 = Student('haitao', 38, 'M', 'python', 30000) s1.tell() s2 = Student('lichuang', 12, 'M', 'python', 11000) print(SchoolMember.member) del s2 print(SchoolMember.member) # 输出 ----end----- just enrolled a new school member [haitao]. ----haitao---- age 38 sex M name haitao amount 0 course python tuition 30000 ----end----- just enrolled a new school member [lichuang]. 3 开除了[lichuang] 2 开除了[Wusir] 开除了[haitao]
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!