Python:父 class 初始化程序可以知道子 class class 属性吗?
Python: Can a parent class initialiser know about child class class-attributes?
抱歉,如果整个 python 代码不好。我还在学习中。
我想做的是,我有几个 classes 共享很多方法。基本上,classes 仅在某些领域有所不同。当我创建这些 classes 之一的对象时,我希望用于创建的数据在断言中使用,以查看创建的对象是否具有预期的数据。每个 class 的预期数据不同,但每个 class 的所有对象都是相同的(即它是 class 属性)。
我看到以下代码在 IDE ("") 中被标记为错误:
class OperatingSystem:
def __init__(self, my_param):
my_os = my_param["os"]
assert my_os == self.os_name
class Win11(OperatingSystem):
os_name = "Windows 11"
class Win10(OperatingSystem):
os_name = "Windows 10"
我认为 IDE 试图通过“未解析的属性引用 (os_name)”告诉我的是父 class __init__
在class 变量已设置。因此,当我试图获取 class 变量(父级的初始化方法)时,该数据还不存在,这肯定会失败。
但是,从逻辑上讲,数据是已知的。所以,我应该有办法让它随时可用。当然,我可以只将常量放在父 class 或上面 - 但我想给 classes 它们自己的属性并做一些更多的 OO :)
- 例如:
Win11.os_name
即使在父 class... 的初始化内部也能正常工作
- 已尝试
self.__class__.os_name
- 仍未解决
你快到了。问题是基础 class OperatingSystem
没有设置 os_name
,所以代码是这样的:
os = OperatingSystem({'os': 'Windows'})
尝试读取 self.os_name
时会失败。
解决此问题的两种方法:
告诉Python,OperatingSystem
是一个抽象基class,这意味着它不能创建直接实例;只有它的子classes可以创建实例:
from abc import ABC
class OperatingSystem(ABC):
...
在基class中设置os_name
:
class OperatingSystem(ABC):
os_name = "A Generic OS"
...
抱歉,如果整个 python 代码不好。我还在学习中。
我想做的是,我有几个 classes 共享很多方法。基本上,classes 仅在某些领域有所不同。当我创建这些 classes 之一的对象时,我希望用于创建的数据在断言中使用,以查看创建的对象是否具有预期的数据。每个 class 的预期数据不同,但每个 class 的所有对象都是相同的(即它是 class 属性)。
我看到以下代码在 IDE ("") 中被标记为错误:
class OperatingSystem:
def __init__(self, my_param):
my_os = my_param["os"]
assert my_os == self.os_name
class Win11(OperatingSystem):
os_name = "Windows 11"
class Win10(OperatingSystem):
os_name = "Windows 10"
我认为 IDE 试图通过“未解析的属性引用 (os_name)”告诉我的是父 class __init__
在class 变量已设置。因此,当我试图获取 class 变量(父级的初始化方法)时,该数据还不存在,这肯定会失败。
但是,从逻辑上讲,数据是已知的。所以,我应该有办法让它随时可用。当然,我可以只将常量放在父 class 或上面 - 但我想给 classes 它们自己的属性并做一些更多的 OO :)
- 例如:
Win11.os_name
即使在父 class... 的初始化内部也能正常工作
- 已尝试
self.__class__.os_name
- 仍未解决
你快到了。问题是基础 class OperatingSystem
没有设置 os_name
,所以代码是这样的:
os = OperatingSystem({'os': 'Windows'})
尝试读取 self.os_name
时会失败。
解决此问题的两种方法:
告诉Python,
OperatingSystem
是一个抽象基class,这意味着它不能创建直接实例;只有它的子classes可以创建实例:from abc import ABC class OperatingSystem(ABC): ...
在基class中设置
os_name
:class OperatingSystem(ABC): os_name = "A Generic OS" ...