1

オブジェクト指向プログラミングでかなり普通だと思うことをしようとしていますが、Python 2.7 のドキュメントが見つかりません スーパークラスのサブクラスを作成したいのですが、スーパークラスがスーパークラスにバインドされている場合.subclass はサブクラスにバインドされ、サブクラスは何もバインドされていません。これが私が思いつくことができる最善の解決策です:

class superclass:
  pass
class subclass(superclass):
  pass
superclass.subclass = subclass
del subclass

サブクラスを独自のファイルに入れたい場合もあれば、そうでない場合もあります。最後の 2 行を手動で実行する必要がない、よりエレガントなソリューションはありますか? それでも

class superclass:
  class subclass:
    pass

サブクラスは実際にはスーパークラスから継承しません。そして、私がやろうとすると:

class superclass:
  class subclass(superclass):
    pass

スーパークラスがバインドされていないというエラー メッセージが表示されます。

4

2 に答える 2

1

参照を行うための単純なクラスデコレータは次のとおりです。

def refer(cls):
    cls.__bases__[0].subclass = cls
    return cls

使用方法は次のとおりです。

>>> class Superclass:
        pass

>>> @refer
    class Subclass(SuperClass):
        pass

モジュールの名前空間に名前を含めたくない場合は、サブクラスを削除する必要があります。

于 2012-04-19T06:11:12.697 に答える
1

これはばかげたことであり、そうするべきではないと思いますが、知識のために:

class Superclass(object):
    pass

Superclass.Subclass = type('Subclass', (Superclass,), {
    'foo': lambda self: self,
})

ここで、ディクショナリ引数には任意のメソッドが含まれます。構文でこれを行う良い方法があるとは思いませんが、それはとにかくclass呼び出すための構文上の砂糖typeです。

lambdaメソッドをsとして定義する必要はありません。def引数がある限り、通常の関数にすることができselfます。ただし、そうすると、おそらくそれらの定義を非表示にしたいと思うでしょう....

于 2012-04-19T05:37:21.357 に答える