Python附加到派生类定义中的类级别列表

2024-09-28 22:28:14 发布

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

class A (object):
    keywords = ('one', 'two', 'three')

class B (A):
    keywords = A.keywords + ('four', 'five', 'six')

有没有办法把A.keywords改成<thing B derives from>.keywords,有点像super(),但是在__init__/self之前?我不喜欢在定义中重复类名。在

用法:

^{pr2}$

Tags: fromobjectinitoneclassthreefourthing
3条回答

使用元类:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

class Meta(type):
    def __new__(cls, name, bases, attrs):
        new_cls = super(Meta,cls).__new__(cls, name, bases, attrs)
        if hasattr(new_cls, 'keywords'):
            new_cls.keywords += ('1','2')
        return new_cls

class B(object):
    keywords = ('0',)
    __metaclass__= Meta

def main():
    print B().keywords

if __name__ == '__main__':
    main()

是的。当你已经初始化了你的类的时候,使用这个属性来查找基类。否则,您需要改变方法,因为B不知道它的父类。在

class A (object):
    keywords = ('one', 'two', 'three')

class B (A):
    def __init__(self):
        keywords = self.__bases__[0].keywords + ('four', 'five', 'six')

实际上,你可以。编写一个descriptor,检查类的基是否有同名的属性,并将传递的属性添加到其值中。在

class parentplus(object):
    def __init__(self, name, current):
        self.name = name
        self.value = current

    def __get__(self, instance, owner):
        # Find the attribute in self.name in instance's bases
        # Implementation left as an exercise for the reader

class A(object):
    keywords = ('one', 'two', 'three')

class B(A):
    keywords = parentplus('keywords', ('four', 'five', 'six'))

相关问题 更多 >