引数を持つクラスデコレータを作成しました。このデコレータは、クラスフィールドID
の値を設定する必要があります。私は、次の方法でそれをやっている:クラスデコレータ - クラスフィールドの変更によってベースクラスの値が変更される
createTest
で
class Base:
ID = "ID_Base"
def __init__(self, n):
self.n = n
def func(self):
pass
def Test(cnt):
def createTest(className):
class _Test(className):
def __init__(self, n):
className.__init__(self, n)
def func(self):
for n in range(cnt):
className.func(self)
name = className.__name__ + "_Test"
_Test.__name__ = name
globals()[name] = _Test
_Test.ID = className.ID + '_test'
className.ID = ''
return _Test
return createTest
@Test(2)
class Derived(Base):
pass
print(Base.ID)
print(Derived.ID)
print(Derived_Test.ID)
が最初に私は、私はその後、新しい_Test
クラスのクラス名を変更し、現在のモジュールのグローバルクラスとして登録、指定されたクラス型から派生したクラスの定義を持っています(最後のブロック)ID
属性を_Test
クラスに設定し、クラス内のID
クラスをパラメータとして渡してクリアし、新しいタイプを返します。それは代わりにデコレータで作成し_Test
のDerived
クラスの属性を変更するのはなぜ
ID_Base
ID_Base_test
ID_Base_test
:私はこれを見たが、それを実行した後
ID_Base
ID_Base_test
:私は、次のような結果を得るためにこれをしませんでしたか?それを修正する方法は?
Python 2.6.6(Linux)とPython 3.4.1(WindowsのActivePython)を使用してこれをチェックしました。
編集:私はまた、以下のような_Test
クラス内のIDを設定しようとしましたが、同じ結果を得た:
def Test(cnt):
def createTest(className):
class _Test(className):
ID = className.ID + '_test'
Derived_Testはどこから来ていますか?彼は注釈も持っていますか? –
Derived_Testの名前はデコレータ、特に次の行に作成されます: 'name = className .__ name__ +" _Test "''_Test .__ name__ = name' ' globals()[name] = _Test' –