이전 블로그에서는 클래스 상속의 구문에 대해 간략하게 이야기했습니다. 오늘은 클래스와 관련된 지식에 대해 자세히 이야기하겠습니다.
먼저 코드를 사용하여 이전에 배운 클래스의 상속을 검토합니다.
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) 여러 클래스 간에 직접적인 상속 관계가 없는 경우 조합을 사용할 수 있습니다.
예를 들어 아래 코드의 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)
마지막 속성에 대해서는 설명자 블로그에서 자세히 설명합니다.
위 내용은 Zero Basic Introduction to Python 14장에서 따온 내용입니다. 더 많은 관련 내용은 PHP 중국어 홈페이지(www.php.cn)를 참고해주세요!