>  기사  >  백엔드 개발  >  14개 상속에 대한 Python 0 기반 소개

14개 상속에 대한 Python 0 기반 소개

黄舟
黄舟원래의
2017-01-16 14:42:161003검색

이전 블로그에서는 클래스 상속의 구문에 대해 간략하게 이야기했습니다. 오늘은 클래스와 관련된 지식에 대해 자세히 이야기하겠습니다.
먼저 코드를 사용하여 이전에 배운 클래스의 상속을 검토합니다.

class Parent:
     def hello(self):
          print("正在调用父类的方法.....")class Child(Parent):
    # pass
    def hello(self):
         print("正在调用子类的方法.....")
p=Parent()
p.hello()
c=Child()
c.hello()

14개 상속에 대한 Python 0 기반 소개


지불해야 할 사항 클래스 상속 시 주의 사항 몇 가지 질문:
(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()

14개 상속에 대한 Python 0 기반 소개

(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)

14개 상속에 대한 Python 0 기반 소개

마지막 속성에 대해서는 설명자 블로그에서 자세히 설명합니다.

위 내용은 Zero Basic Introduction to Python 14장에서 따온 내용입니다. 더 많은 관련 내용은 PHP 중국어 홈페이지(www.php.cn)를 참고해주세요!


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.