前回のブログではクラス継承の構文について簡単にお話しましたが、今日はクラスの関連知識について詳しくお話します。
まず、コードの一部を使用して、以前に学習したクラスの継承を確認します:
class Parent: def hello(self): print("正在调用父类的方法.....")class Child(Parent): # pass def hello(self): print("正在调用子类的方法.....") p=Parent() p.hello() c=Child() c.hello()
クラスの継承で注意する必要があるいくつかの問題:
(1) サブクラスが親クラスと同じ名前のクラス メソッドまたは属性は、親クラスの対応するメソッドまたは属性を自動的にオーバーライドします。
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は多重継承もサポートしています
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) 複数のクラス間に直接の継承関係がない場合は、組み合わせて使うことができます。
たとえば、以下のコードの 3 つのクラス Turtle、Fish、Pool の間には明らかな継承関係はありませんが、組み合わせを使用すると、これらのクラス間の問題を簡単に解決できます。次のコードは、池に金魚とカメが何匹いるかを出力する問題を解決します。主な解決策は、カメと金魚のインスタンスを池クラスに入れることです。
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()
最後に、クラスに関する組み込み関数をいくつか追加します。
#前面是子类,后面是基类 #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)
最後のプロパティについては、記述子ブログで詳しく説明します。
上記は、Python ゼロ基礎入門の第 14 章から継承された内容です。さらに関連する内容については、PHP 中国語 Web サイト (www.php.cn) に注目してください。