Dans le blog précédent, j'ai brièvement parlé de la syntaxe de l'héritage de classe. Aujourd'hui, je vais parler en détail des connaissances associées aux classes.
Utilisez d'abord un morceau de code pour revoir l'héritage des classes que vous avez apprises auparavant :
class Parent: def hello(self): print("正在调用父类的方法.....")class Child(Parent): # pass def hello(self): print("正在调用子类的方法.....") p=Parent() p.hello() c=Child() c.hello()
Nécessaire dans l'héritage des classes Plusieurs points à noter :
(1) Si une méthode ou un attribut portant le même nom que la classe parent est défini dans une sous-classe, la méthode ou l'attribut correspondant de la classe parent sera automatiquement écrasé.
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 prend également en charge l'héritage multiple
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) Lorsqu'il n'y a pas de relation d'héritage directe entre plusieurs classes Nous pouvons utiliser des combinaisons.
Par exemple, les trois classes Turtle, Fish et Pool dans le code ci-dessous n'ont pas de relation d'héritage évidente entre elles, mais l'utilisation d'une combinaison peut facilement résoudre les problèmes entre ces classes. Le code suivant résout le problème de l'affichage du nombre de poissons rouges et de tortues dans l'étang. La solution principale est de placer les instanciations de tortues et de poissons rouges dans la classe étang.
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()
Ajoutez enfin quelques fonctions intégrées sur la classe :
#前面是子类,后面是基类 #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)
La dernière propriété sera détaillée dans l'explication du blog du descripteur.
Ce qui précède est le contenu hérité du 14ème chapitre de Zero Basic Introduction to Python. Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois (www.php.cn) !