78

Pythonのクラスメソッドとは何ですか?を読みました。しかし、その投稿の例は複雑です。Pythonのクラスメソッドの特定のユースケースの明確でシンプルな基本的な例を探しています。

Pythonクラスメソッドがその仕事に適したツールとなる小さな具体的なユースケースの例を挙げていただけますか?

4

6 に答える 6

57

初期化のためのヘルパー メソッド:

class MyStream(object):

    @classmethod
    def from_file(cls, filepath, ignore_comments=False):    
        with open(filepath, 'r') as fileobj:
            for obj in cls(fileobj, ignore_comments):
                yield obj

    @classmethod
    def from_socket(cls, socket, ignore_comments=False):
        raise NotImplemented # Placeholder until implemented

    def __init__(self, iterable, ignore_comments=False):
       ...
于 2011-04-21T01:40:47.337 に答える
33

さて__new__、かなり重要なクラスメソッドです。通常、インスタンスはここから取得されます

soはもちろんdict()呼び出しdict.__new__ますが、クラスメソッドである辞書を作成する別の便利な方法がありますdict.fromkeys()

例えば。

>>> dict.fromkeys("12345")
{'1': None, '3': None, '2': None, '5': None, '4': None}
于 2011-04-21T01:48:27.257 に答える
21

わかりません、名前付きコンストラクターメソッドのようなものですか?

class UniqueIdentifier(object):

    value = 0

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

    @classmethod
    def produce(cls):
        instance = cls(cls.value)
        cls.value += 1
        return instance

class FunkyUniqueIdentifier(UniqueIdentifier):

    @classmethod
    def produce(cls):
        instance = super(FunkyUniqueIdentifier, cls).produce()
        instance.name = "Funky %s" % instance.name
        return instance

使用法:

>>> x = UniqueIdentifier.produce()
>>> y = FunkyUniqueIdentifier.produce()
>>> x.name
0
>>> y.name
Funky 1
于 2011-04-21T01:33:49.697 に答える
10

@classmethodコードを使用するためにクラスのインスタンスを必要としない場合に、グローバル関数の作成を避けるために、コードの一部をクラスに関連付けるために最もよく使用することがわかりました。

たとえば、あるパターンに準拠している場合にのみキーが有効であると見なすデータ構造があるとします。クラスの内外からこれを使用したい場合があります。ただし、さらに別のグローバル関数を作成したくありません。

def foo_key_is_valid(key):
    # code for determining validity here
    return valid

このコードを、関連付けられているクラスでグループ化することをお勧めします。

class Foo(object):

    @classmethod
    def is_valid(cls, key):
        # code for determining validity here
        return valid

    def add_key(self, key, val):
        if not Foo.is_valid(key):
            raise ValueError()
        ..

# lets me reuse that method without an instance, and signals that
# the code is closely-associated with the Foo class
Foo.is_valid('my key')
于 2011-04-21T01:39:18.857 に答える
-4
in class MyClass(object):
    '''
    classdocs
    '''
    obj=0
    x=classmethod
    def __init__(self):
        '''
        Constructor
        '''
        self.nom='lamaizi'
        self.prenom='anas'
        self.age=21
        self.ville='Casablanca'
if __name__:
    ob=MyClass()
    print(ob.nom)
    print(ob.prenom)
    print(ob.age)
    print(ob.ville)
于 2015-02-09T19:52:43.773 に答える