假设我有以下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()
我从this question知道,不应该将self
从子类传递到基类。也就是说,假设你犯了这样的错误,行print(gandalf.name)
打印<Wizard.Wizard object at 0x049F20B0>
,因为name
从未被赋值,但这个值到底意味着什么?你知道吗
super()
不返回类;它返回代理对象,因此super().__init__(self, name)
的行为与foo.__init__(self, name)
非常相似,其中foo
是Wizard
的“真实”实例。在这种情况下,调用Player.__init__
的第一个参数self
已经被赋值,因此您的显式self
被赋值给下一个参数name
,您的第二个参数name
被赋值给第三个参数player_type
。你知道吗换句话说,
Player
是MRO中的下一个类,super().__init__(self, name)
与Player.__init__(self, self, name)
相同。你知道吗换句话说,
super().__init__
是一个绑定方法,因此已经提供了__init__
函数的第一个参数self
。你知道吗相关问题 更多 >
编程相关推荐