In the previous blog, I briefly talked about the syntax of class inheritance. Today, I will talk about the related knowledge of classes in detail.
Let’s first use a piece of code to review the inheritance of classes we have learned before:
class Parent: def hello(self): print("正在调用父类的方法.....")class Child(Parent): # pass def hello(self): print("正在调用子类的方法.....") p=Parent() p.hello() c=Child() c.hello()
What you need to pay attention to in the inheritance of classes Several questions:
(1) If a method or attribute with the same name as the parent class is defined in a subclass, the corresponding method or attribute of the parent class will be automatically overwritten.
import random as rclass Fish: def __init__(self): self.x=r.randint(0,10) self.y=r.randint(0,10) def move(self): self.x-=1 print("我的位置是:",self.x,self.y)class Goldfish(Fish): passclass Carp(Fish): passclass Salmon(Fish): passclass Shark(Fish): def __init__(self): #调用未绑定的父类方法,传进去的是子类的实例化对象 #Fish.__init__(self) #使用super()函数 super().__init__() self.hungry=True def eat(self): if self.hungry: print("吃货的梦想是天天有的吃") self.hungry=False else: print("太撑了,吃不下了") shark=Shark() shark.move()#这样写的话程序会报错,因为子类Shark重写了了#__init__方法,这样就会覆盖父类的__init__方法
(2)Python also supports multiple inheritance
class Base1: def foo1(self): print("我是foo1,我为Base1代言...")class Base2: def foo2(self): print("我是foo2,我为Base2代言...")class C(Base1,Base2): passc=C() c.foo1() c.foo2()
(3) When there is no direct inheritance relationship between several classes, we can use combination .
For example, the three classes Turtle, Fish, and Pool in the code below have no obvious inheritance relationship between them, but the use of combination can easily solve the problems between these classes. The following code solves the problem of outputting how many goldfish and turtles there are in the pond. The main solution is to put the turtle and goldfish instantiations into the pond class.
class Turtle: def __init__(self,x): self.num=xclass Fish: def __init__(self,x): self.num=xclass Pool: def __init__(self,x,y): #将类的实例化放到另一个类中 self.turtle=Turtle(x) self.fish=Fish(y) def print_num(self): print("水池里总共有乌龟%d只,小鱼%d条!"%(self.turtle.num,self.fish.num)) pool=Pool(1,10) pool.print_num()
Finally add some built-in functions about the class:
#前面是子类,后面是基类 #issubclass(class,classinfo) #判断一个类是否为另一个类的子类 #一个类被认为是自身的子类class A: passclass B(A): passprint(issubclass(B,A)) #isinstance(object,classinfo) #前面是一个实例化对象,后面是类#检查实例对象是否属于这个类b1=B(); print(isinstance(b1,B)) #hasattr(object,name) #测试一个对象是否有特定的属性class C: def __init__(self,x=0): self.x=x#一定要注意Python没有变量的定义c1=C() print(hasattr(c1,"x")) #getattr(object,name[,default]) #返回对象指定的属性值,如果不存在,打印设置的默认值print(getattr(c1,'x')) print(getattr(c1,'y',"您访问的参数不存在")) #setattr(object,name,value) #设定属性的值,如果不存在,会自动新建setattr(c1,"y","Yaoxiangxi") print(getattr(c1,'y',"您访问的参数不存在"))#delattr(object,name) #删除属性delattr(c1,'y') #property(fget=None,fset=None,fdel=None,doc=None) #通过属性设置属性class C: def __init__(self,size=10): self.size=size def getSize(self): return self.size def setSize(self,value): self.size=value def delSize(self): del self.size #删除某个属性 #便于代码的修改 x=property(getSize,setSize,delSize) c1=C() print(c1.getSize()) print(c1.x) c1.x=100print(c1.x)
The final property will be explained in detail in the descriptor blog.
The above is the content inherited from the fourteenth chapter of Python Zero Basic Introduction. For more related content, please pay attention to the PHP Chinese website (m.sbmmt.com)!