我有一个抽象的基类。但是,此类型的每个对象都将保存值val。
在派生类中,我将拥有一个__init__函数。此函数不接受值val作为输入,它只是根据定义知道它。
class Base(ABC):
pass
class Derived(Base):
def __init__(self):
self.val = 5Base的所有子类都会有这个val,它们都会在内部设置它,也就是说,它不会是一个参数。然而,现在如果我使用继承,没有人知道Base-objects有val。
那么我该如何构建这段代码,这样用户现在就可以知道,如果它是一个Base-object,那么它就会有val。我是否以某种方式使用了类变量?或者即使Base是一个抽象方法,我也需要给它一个__init__吗?如果派生类在其__init__中没有任何参数,那么应该如何构造该__init__
发布于 2021-01-25 02:08:36
使用不允许从基类访问的描述器。
from abc import ABC
from weakref import WeakKeyDictionary
class Abstract_attr:
def __init__(self, name, cls_name):
self.name = name
self.cls_name = cls_name
self.data = WeakKeyDictionary()
def __get__(self, instance, owner):
if instance not in self.data:
raise NotImplementedError('NOT ACCESSIBLE FROM BASE CLASS')
return self.data.get(instance, None)
def __set__(self, instance, val):
print(self, instance.__class__.__name__)
if self.cls_name == instance.__class__.__name__:
raise NotImplementedError('CANNOT SET ON BASE CLASS')
self.data[instance] = val
class Base(ABC):
val = Abstract_attr('val','Base')
class Derived(Base):
def __init__(self):
self.val = 5
print(Derived().val)
print('val' in dir(Base))
Base().val5
True
Traceback (most recent call last):
File "c:/pyfoo/tmp.py", line 57, in <module>
Base().val
File "c:/pyfoo/tmp.py", line 40, in __get__
raise NotImplementedError('NOT ACCESSIBLE FROM BASE CLASS')
NotImplementedError: NOT ACCESSIBLE FROM BASE CLASS如果你需要hasattr工作,只需要返回一些不可用的东西,而不是引发一个错误。
class Abstract_attr:
def __init__(self, name, cls_name):
self.name = name
self.cls_name = cls_name
self.data = WeakKeyDictionary()
def __get__(self, instance, owner):
if instance not in self.data:
return 'NOT ACCESSIBLE FROM BASE CLASS'
else:
return self.data.get(instance, None)
def __set__(self, instance, val):
# print(self, instance.__class__.__name__)
if self.cls_name == instance.__class__.__name__:
return 'CANNOT SET ON BASE CLASS'
else:
self.data[instance] = valhttps://stackoverflow.com/questions/65873679
复制相似问题