比较Python中父类和子类的属性
我有这样一个Python类:比较Python中父类和子类的属性,python,oop,Python,Oop,我有这样一个Python类: class A: __val1: float = 0.0 __val2: float def __init__(): validate() def validate() -> bool: if not hasattr(self, __val2): # how is this supposed to be done? raise NotImplementedError() return self
class A:
__val1: float = 0.0
__val2: float
def __init__():
validate()
def validate() -> bool:
if not hasattr(self, __val2): # how is this supposed to be done?
raise NotImplementedError()
return self.__val1 >= self.val2
class B(A):
A.__val2 = 1.0
[...]
我的目标是将A
用作一个抽象类,其中子类被强制实现\uu val2
我创建了一个子类B
:
class B(A):
__val2 = 1.0
def __init__():
super().__init__()
当我初始化类B
的对象时,会引发以下错误:
E AttributeError: 'B' object has no attribute '_A__val2'
我试着这样修改B
:
class A:
__val1: float = 0.0
__val2: float
def __init__():
validate()
def validate() -> bool:
if not hasattr(self, __val2): # how is this supposed to be done?
raise NotImplementedError()
return self.__val1 >= self.val2
class B(A):
A.__val2 = 1.0
[...]
但这引发了同样的异常
尝试相同的操作,但使用super
:
class B(A):
super.__val2 = 1.0
[...]
但这带来了另一个错误:
E TypeError: can't set attributes of built-in/extension type 'super'
处理这种抽象的Pythonic方法是什么?
应该如何实现
validate()
,以便它检查\uuu val2
?当您对类属性名称使用前面的双下划线时,python会将它们转换为\uuu
。所以在你的例子中,A.。uu val2
变成A.u val2
和B.。u val2
变成B.u val2
,这意味着它们不会共享同一个名称。请参阅Thierry Lathuille在对您的问题的评论中共享的链接,这里是指向python文档的链接:
您可以通过不使用双下划线来解决此问题,因此选择类似于\u val2
或val2
的选项
代码中还有一些其他问题:所有类方法都需要self
作为第一个参数,并且需要通过调用self.
来访问它们。因此,要访问validate
,需要使用self.validate()
调用它。另外,hasattr
的第二个参数必须是字符串
下面是一个更新的示例,可以解决您的问题:
class A:
_val1: float = 0.0
_val2: float
def __init__(self):
self.validate()
def validate(self) -> bool:
if not hasattr(self, '_val2'):
raise NotImplementedError()
return self._val1 >= self._val2
class B(A):
_val2 = 1.0
def __init__(self):
super().__init__()
print(B()._val2)
不确定你的建议是什么。在所有位置将
\uuu val2
重命名为val2
并没有什么区别。使用符号\u A_uval2
(除非我误解了您建议应用它的位置)。您的类定义不正确<代码>self没有在任何地方定义,并且您似乎混淆了类属性和实例属性。