2

カテゴリごとに異なる名前を持つカテゴリクラスがあります。カテゴリの名前は不明で、良いものと悪いものがあります。すべてのカテゴリは同じ動作を共有するため、カテゴリの種類ごとにサブクラスを作成したくありません。問題この方法でさまざまなカテゴリを作成しようとしているときに来ます:

Category.GOOD

このステートメントは、名前が「良い」に設定されたカテゴリ オブジェクトを返す必要があるため、次のことを試します。

class Category(object):                                                                                                            

  def __init__(self, name):                                                                                                      
      self.name = name                                                                                                           

  @property
  def GOOD(self):
      category = Category(name='good')                                                                                           
      return category                                                                                                            

  @property
  def BAD(self): 
      category = Category(name='bad')                                                                                            
      return category   

次に、次の出力でカテゴリを作成して使用します。

c = Category.GOOD
c.name
AttributeError: 'property' object has no attribute 'name'

これが機能しないことに気づき、Java のようなアプローチを試みます。

class Category(object):                                                                                                          

    GOOD = Category(name='good')
    BAD = Category(name='bad')                                                                                                   

    def __init__(self, name):
        self.name = name

ここで得られるのは未定義の名前「Category」エラーです。そのため、このようなカテゴリ オブジェクトを作成する Pythonic な方法があるかどうかを質問します。

4

4 に答える 4

2

おそらくクラスメソッドを使用したいでしょう:

class Category(object):

    @classmethod
    def GOOD(cls):
        category = cls(name='GOOD')
        return category

できるようになりc = Category.GOOD()ました。

于 2013-01-15T14:15:54.190 に答える
2

プロパティでこれを行うことはできません。を使用するかclassmethod、独自の記述子を作成する必要があります。

class classproperty(property):
    def __get__(self, inst, cls):
        return self.fget(cls)

propertyここではデコレータを悪用しています。と も実装__set____del__ていますが、便宜上、ここでは無視して構いません。

次に、代わりにそれを使用しますproperty

class Category(object):
    def __init__(self, name):
        self.name = name

    @classproperty
    def GOOD(cls):
        return cls(name='good')

    @classproperty
    def BAD(cls):
        return cls(name='bad')

アクセスするCategory.GOODようになりました:

>>> Category.GOOD
<__main__.Category object at 0x10f49df50>
>>> Category.GOOD.name
'good'
于 2013-01-15T14:29:29.563 に答える
1

これにはモジュール変数を使用します。あなたがモジュールを持っていると考えてくださいcategory.py

class Category(object):
    # stuff...

次に、2 つのグローバル オブジェクトをその中に入れます。

GOOD = Category(name='good')
BAD = Category(name='bad')

次のように使用できます。

from path.to.category import GOOD, BAD

これがpythonicだとは言いませんが、このアプローチはエレガントだと思います。

于 2013-01-15T14:14:30.763 に答える
0

そのクラス定義自体の中でクラス定義を使用できないという主なポイント。したがって、目的を達成するための最も直接的な方法は、以下に示すようにクラス/静的メソッドを使用するか、パッケージ定数を使用することです。

class Category(object):
    def __init__(self, name):
        self.name = name

    @classmethod
    def GOOD(cls):
        return Category(name='good')

    @classmethod
    def BAD(cls):
        return Category(name='bad')

print Category.GOOD().name

また

class Category(object):
    def __init__(self, name):
        self.name = name

    @staticmethod
    def GOOD():
        return Category(name='good')

    @staticmethod
    def BAD():
        return Category(name='bad')

print Category.GOOD().name
于 2013-01-15T14:21:20.803 に答える