首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python:如何构造基类的init函数?

Python:如何构造基类的init函数?
EN

Stack Overflow用户
提问于 2021-01-25 01:20:28
回答 2查看 31关注 0票数 0

我有一个抽象的基类。但是,此类型的每个对象都将保存值val

在派生类中,我将拥有一个__init__函数。此函数不接受值val作为输入,它只是根据定义知道它。

代码语言:javascript
复制
class Base(ABC):
    pass

class Derived(Base):
    def __init__(self):
        self.val = 5

Base的所有子类都会有这个val,它们都会在内部设置它,也就是说,它不会是一个参数。然而,现在如果我使用继承,没有人知道Base-objects有val

那么我该如何构建这段代码,这样用户现在就可以知道,如果它是一个Base-object,那么它就会有val。我是否以某种方式使用了类变量?或者即使Base是一个抽象方法,我也需要给它一个__init__吗?如果派生类在其__init__中没有任何参数,那么应该如何构造该__init__

EN

回答 2

Stack Overflow用户

发布于 2021-01-25 01:28:05

如果我理解正确的话,您希望valbase的一个属性,由它的子类继承,并在子类中赋值?

代码语言:javascript
复制
class Base:
    # val is now a class attribute of base
    val = None

class Derived(Base):

    def __init__(self):

        self.val = 5

类属性在类级别可用,因此它们不需要实例(self)来创建它们。但是,它们是在类中通过表单self.attribute访问的

票数 0
EN

Stack Overflow用户

发布于 2021-01-25 02:08:36

使用不允许从基类访问的描述器。

代码语言:javascript
复制
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().val

代码语言:javascript
复制
5
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工作,只需要返回一些不可用的东西,而不是引发一个错误。

代码语言:javascript
复制
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] = val
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65873679

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档