如何确保每个子类都获得其父类属性的新副本(在Python中)?

2024-09-27 07:33:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个基类,它有一个空列表作为类属性。许多子类继承自这个基类。其目的是将此list class属性与class方法结合使用,以便允许每个子类跟踪其自身实例的特定集合。每个类都应该有一个单独的列表,其中只包含自己的实例。你知道吗

当我对这个继承方案进行一个简单的实现时,在调试过程中,我注意到实际上每个子类都与一个类属性共享一个完全相同的列表,并且我再次对python通过引用传递列表感到有趣。仔细观察,似乎父级的每个类属性(方法和值)都是通过引用传递给每个子级的,除非在子级的定义中显式重写某个特定属性,否则这一点不会改变。你知道吗

在创建子对象时重新初始化其类变量的最佳方法是什么?理想的情况下,我希望能有一个方法来确保每个孩子都从一个cls实例属性,该属性是唯一的空列表,不涉及任何子级中的额外代码。否则,我为什么一开始就为继承而烦恼呢?(不要回答)


Tags: 实例方法目的列表属性定义过程方案
3条回答

对@DanielRoseman和他有见地的回答没有不敬,但我想我应该写下你将如何使用元类来完成我理解的你想要完成的事情:

你知道吗麦迪地址:

class Meta(type):
    def __init__(cls, name, bases, attrs):
        cls.foo = []

class A:
    __metaclass__ = Meta

class B(A):
    pass

鉴于此:

>>> import mc
>>> mc.A.foo
[]
>>> mc.A.foo.append(1)
>>> mc.A.foo
[1]
>>> mc.B.foo
[]

你的意思是这样的:

    >>> class Foo():
    ...   alist = []
    ...   def __init__(self):
    ...     pass
    >>> foo = Foo()
    >>> foo.alist
    []
    >>> Foo.alist
    []
    >>> Foo.alist.append(7)
    >>> Foo.alist
    [7]
    >>> foo.alist
    [7]
    >>> foo2 = Foo()
    >>> foo2.alist
    [7]

这是您可能需要进入元类的要点。您的意思是,每次定义新的子类时,都需要一组新的变量。因此,元类是类类型的类:每次定义子类时,都要实例化元类的新实例。每个元类实例都可以有自己的实例变量,这意味着每个子类都有自己的类变量集。你知道吗

关于如何在Marty Alchin's blog上使用元类来做这类事情,有一篇很棒的文章。你知道吗

相关问题 更多 >

    热门问题