首页 > 解决方案 > 变量为空时给出的值

问题描述

假设我有以下Player基类:

from abc import ABC, abstractmethod

class Player(ABC):

    def __init__(self, name, player_type):
        self.name = name
        self.player_type = player_type

Wizard

from Player import Player

class Wizard(Player):

    def __init__(self, name, player_type = "Wizard"):
        super().__init__(self,name)

Main

from Player import Player
from Wizard import Wizard


def main():

    gandalf = Wizard("Gandalf")
    print(gandalf.name)

    # Will print gandalf because the parameter assignment was shifted
    # because self was passed from the child to base class.
    print(gandalf.player_type)

if __name__ == "__main__":
    main()

我从这个问题中知道,你不应该self从子类传递到基类。话虽如此,假设您犯了错误,该行print(gandalf.name)打印<Wizard.Wizard object at 0x049F20B0>因为name从未分配,但该值究竟是什么意思?

标签: pythonpython-3.x

解决方案


super()不返回类;它返回一个代理对象,因此super().__init__(self, name)行为与 非常相似foo.__init__(self, name),其中foo是 的“真实”实例Wizard。在这种情况下,self调用的第一个参数Player.__init__已经分配,​​因此您的显式 self分配给下一个参数,name而您的第二个参数name分配给第三个参数player_type

换句话说,Player作为 MRO 中的下一个班级,super().__init__(self, name)Player.__init__(self, self, name).

换句话说,super().__init__是一个绑定方法,所以__init__函数的第一个参数self已经被提供了。


推荐阅读