self理解 & 子类调用父类函数的方法

1、self的含义

类是抽象的模板,实例是根据类创建出的一个个具体对象。

下面代码中,andy_1.run() 会被python解释器转化为 Dog.run(andy_1),可以看到对象 andy_1 被传给了参数 self,用于表明是Dog类的哪个对象在调用run方法。

这种指明是Dog类的哪个对象在调用run方法,被称为将run方法绑定到andy_1 对象。

这就是为什么类中定义的函数(包括__init__),都要用self作为第一个参数,就是用来接受具体的对象。特别说明的是,不一定非要用self做参数名,用a b c等任意变量名均可,self只是约定俗成的习惯。

即便是被系统自动调用的函数,如__init__,系统也会将要初始化的对象传递给__init__方法的 self 参数。(__init__并不是c++中的构造方法,d=Dog(‘andy’) 实际会等价于 d=object.__new__(Dog),Dog.__init__(d, ‘andy’) 两条语句,即调用init前,对象已经被创建完成。

class Dog(object):
    def __init__(self, name):
        self.name = name

    def run(self):
         print self.name, 'is running'

andy_1 = Dog('andy_1')
andy_1.run()
andy_2 = Dog('andy_2')
andy_2.run()

2、子类调用父类的函数

子类调用父类有两种方式:通过父类名 或 通过super函数。
我们用最常见的是调用父类的 __init__()方法说明。
(1)使用父类名
实际上使用了python解释器的方式调用类的函数,即将父类的 init 函数绑定到b1上。注意 A.__init__(self) 这行代码中,self参数实际已经被赋值为 b1 对象。

class A(object):
    def __init__(self):
        print 'in A init'

class B(A):
    def __init__(self):
        A.__init__(self)

b1 = B()

这种方式有一个缺点,当子类的父类变化为其他类时,所有显示使用父类名的地方都要被修改为新的父类名。因此,推荐使用super 函数的方式调用父类函数。

(2)使用super函数:super(type, [type-or-object])
super函数返回的不一定是父类,实际是MRO表中下一个类。:
super做的是下面这件事

def super(cls, inst):
    mro_list = inst.__class__.mro()
    return mro_list[mro_list.index(cls) + 1]

两个参数 cls 和 inst 分别做了两件事:
1. inst 负责生成 MRO 的 list
2. 通过 cls 定位当前 MRO 中的 index,并返回 mro[index + 1]

举例:

class A(object):
    def __init__(self):
        print 'in A init'

class B(A):
    def __init__(self):
        super(B, self).__init__()
b = B()
  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 29
    评论
当我们使用面向对象编程语言时,经常会使用父类子类之间的继承关系来实现代码的复用和扩展。在这种情况下,可以利用父类的构造函数来实现子类的构造函数。 具体来说,当一个子类继承自一个父类时,子类可以通过调用父类的构造函数来初始化继承自父类的属性。这样,子类就可以利用父类已有的功能来实现自己的功能,并且还可以添自己特有的功能。 在面向对象编程,我们通常使用`super()`函数调用父类的构造函数。这个函数可以在子类的构造函数使用,它会返回父类的实例,我们可以使用这个实例来调用父类方法和属性。 下面是一个简单的示例代码,展示了如何利用父类的构造函数来实现子类的构造函数: ``` class Animal: def __init__(self, name, species): self.name = name self.species = species class Dog(Animal): def __init__(self, name, breed): super().__init__(name, species="Dog") self.breed = breed my_dog = Dog("Fido", "Labrador Retriever") print(my_dog.name) # Output: Fido print(my_dog.species) # Output: Dog print(my_dog.breed) # Output: Labrador Retriever ``` 在上面的代码,`Animal`类是一个父类,它有两个属性`name`和`species`。`Dog`类是一个子类,它继承自`Animal`类,并且添了一个新的属性`breed`。在`Dog`类的构造函数,我们首先调用父类的构造函数来初始化`name`和`species`属性,然后再添`breed`属性。最后,我们创建了一个`my_dog`对象,并且输出了它的三个属性。
评论 29
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值