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

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

に変更A.keywordsする方法はあります<thing B derives from>.keywordssuper()? __init__/self定義でクラス名を繰り返すのは好きではありません。

使用法:

>>> A.keywords
('one', 'two', 'three')
>>> B.keywords
('one', 'two', 'three', 'four', 'five', 'six')
4

4 に答える 4

5

実際、できます。同じ名前の属性のクラスのベースをチェックする記述子を作成し、渡された属性をその値に追加します。

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'))
于 2012-04-12T07:36:36.027 に答える
1

はい。__bases__ 属性を使用して、クラスを既に初期化している場合はいつでも基本クラスを見つけます。それ以外の場合は、B がその親を認識していないため、アプローチを変更する必要があります。

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

class B (A):
    def __init__(self):
        keywords = self.__bases__[0].keywords + ('four', 'five', 'six')
于 2012-04-12T07:33:06.120 に答える
1

メタクラスを使用:

#!/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()
于 2012-04-12T07:34:22.040 に答える
0

クラスや定義を追加しなくても、回避策スタイルのソリューションが機能することがわかりました。

class BaseModelAdmin(admin.ModelAdmin):
    _readonly_fields = readonly_fields = ('created_by', 'date_add', 'date_upd', 'deleted')

そしてサブクラス化するとき

class PayerInline(BaseTabularInline):
    exclude = BaseTabularInline._exclude + ('details',)

お役に立てれば。

于 2015-04-16T05:03:20.867 に答える