Python 面向对象 继承 多重继承 类 类对象 实例对象 绑定
发布日期:2021-05-07 23:05:29 浏览次数:20 分类:精选文章

本文共 3068 字,大约阅读时间需要 10 分钟。

文章目录

继承

Python面向对象编程的核心特征之一是继承关系。通过使用继承语法,我们可以定义新类继承已有的类,从而继承其属性和方法。例如,使用以下代码可以创建一个继承自`BaseClassName`的子类`DerivedClassName`:

class DerivedClassName(BaseClassName):    pass

继承关系具有以下几个特点:

  • 子类可以继承父类的所有属性和方法。如果子类定义了与父类相同名字的属性或方法,则子类的属性或方法会覆盖父类的对应属性或方法,但不会影响父类的属性和方法。
  • 在子类中,如果需要调用父类的方法,可以通过未绑定方式(即不使用`self`传递对象)直接调用父类的方法。这种方式适用于需要在子类中初始化对象时。
  • import random as rclass Fish():    def __init__(self):        self.x = r.randint(1,10)        self.y = r.randint(1,10)    def move(self):        self.x += 1class Shark(Fish):    def __init__(self):        self.hungry = True        Fish.__init__(self)  #保留鲨鱼的位置,调用Fish类的初始化方法    def eat(self):        if self.hungry:            print("eat")            self.hungry = False        else:            print("eaten")
    1. 在多继承的情况下,使用`super()`函数可以自动查找并调用父类的方法,无需显式指定父类名称。这在处理多个父类时非常便利。
    2. (1) 多重继承

      class DerivedClassName(Base1, Base2, Base3, ...):    pass

      通过多重继承,可以将多个类的属性和方法继承到一个子类中。然而,在多重继承中,如果多个父类中定义了相同名称的方法,子类只会继承第一个父类的方法。

      >>> class A():    def print1(self):        print("A")>>> class B():    def print1(self):        print("B")>>> class C(A, B):    pass>>> c = C()>>> c.print1()A

      (2) 组合方法

      • 组合方法适用于将多个类的实例化对象组合到一个新类中,这种方式不需要类之间有直接或间接的继承关系。
      • 纵向组合(即一个类继承另一个类)需要使用继承关系,而横向组合(即两个类没有直接或间接的继承关系)则适合使用组合方法。
      class Turtle():    def __init__(self, x):        self.num = xclass Fish():    def __init__(self, y):        self.num = yclass Pool():    def __init__(self, x, y):        self.turtle = Turtle(x)       # 组合Turtle类的实例化对象        self.fish = Fish(y)        # 组合Fish类的实例化对象    def print_num(self):        print("池里有鱼%d有甲鱼%d" % (self.turtle.num, self.fish.num))

      ===========

      类、类对象和实例对象

      在Python中,一个类定义完成后会成为一个类对象。类对象包含类的属性和方法。当我们使用`class DerivedClassName(BaseClassName): pass`语句创建一个新类时,`DerivedClassName`实际上是一个指向类对象的引用。

      • 类是用来定义对象类型的蓝图,类中的属性是静态的,属于类本身,而不是实例。
      • 类对象(如`DerivedClassName`)是类本身的实例化对象,包含类的属性和方法。类对象可以被赋值给变量,例如:
      • my_class = DerivedClassName()
      • 实例对象(如`my_object = my_class()`)是类对象的实例化对象,包含类属性和方法的具体值。类属性和方法在实例对象上会被动态绑定。
      • 如果实例对象和类对象有相同的属性或方法名称,实例对象的属性会覆盖类对象的属性。这是Python的动态绑定机制的特点之一。
      class C():    def x(self):        print("Python")>>> c = C()>>> c.x()Python>>> c.x = 1>>> c.x1>>> c.x()Traceback (most recent call last):  File "        ", line 1, in              c.x()TypeError: 'int' object is not callable

      注意事项:

      • 不要试图在一个类中定义所有可能的属性和方法。尽量利用继承和组合的原则来扩展类。
      • 使用不同词性名称命名类的属性和方法,以避免命名冲突。例如,属性使用名词,方法使用动词。

      绑定

      在Python中,方法必须与实例对象绑定才能被调用。这就是所谓的绑定机制。例如:

      >>> class A():    def print1():        print("A")>>> a = A()>>> a.print1()Traceback (most recent call last):  File "        ", line 1, in              a.print1()TypeError: print1() takes 0 positional arguments but 1 was given
      • 方法的第一个参数必须是`self`,否则会导致绑定错误。
      >>> class A():    def setxy(self, x, y):        self.x = x        self.y = y    def printxy(self):        print(self.x, self.y)>>> a = A()>>> a.__dict__{   }>>> A.__dict__mappingproxy({   '__module__': '__main__', 'setxy':        , 'printxy':          , '__dict__':            , '__weakref__':              , '__doc__': None})>>> a.setxy(1, 2)>>> a.__dict__{   'x': 1, 'y': 2}>>> del A>>> a.printxy()1 2>>> a.__dict__{   'x': 1, 'y': 2}
      • 使用`self`跟踪与类相关的属性和值。
    上一篇:Python 类与对象 BIF
    下一篇:Python 面向对象编程

    发表评论

    最新留言

    关注你微信了!
    [***.104.42.241]2025年05月06日 21时28分40秒