python - 变量为空时给出的值
问题描述
假设我有以下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
从未分配,但该值究竟是什么意思?
解决方案
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
已经被提供了。
推荐阅读
- material-ui - 自定义图标
组件 - powershell - 搜索文件时可以在目录路径中使用 %username% 吗?
- r - 检查两列的条件,如果为真,则操作 R 中的第三列
- c++ - 对于相同的精确计算,无法解释的不同 omp_get_wtime()
- java - FragmentManager 清理 .addToBackStack
- c# - 向 AAD OpenIDConnect 认证用户添加自定义声明
- c# - 复杂的 LINQ to XML 查询帮助
- python - LogEntry 是做什么的?
- typescript - 使用 observables 返回 http 响应的最佳模式
- angular - Karma 测试随机重启并在 Edge 中“加倍”iframe