比较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

我有这样一个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.__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没有在任何地方定义,并且您似乎混淆了类属性和实例属性。