1

Pep8は、常にclsクラス メソッド定義の最初の引数として使用することをお勧めします。cls.cartridge_stateここで、インスタンス メソッド (この場合: ) でも使用できるクラス変数 (この場合: ) を使用したいとします__init__。そのためには、変数をグローバルにする必要があります (以下のコードを参照)。ただし、インスタンス化FountainPenすると、次のランタイム エラーが発生します。

self.cartridge_state = cls.cartridge_state
NameError: global name 'cls' is not defined

しかし、もう一度変更global cartridge_stateするglobal cls.cartridge_stateと、モジュールをインポートしようとすると、syntaxError が発生します。

class FountainPen(object):
    cartridge_ink = "water-based"
    @classmethod
    def toggle_default_cartridge_state(cls):
        i = 0
        cartridge_states = ['non-empty','empty']
        global cartridge_state
        cls.cartridge_state = cartridge_states[i]
        i += 1

    def __init__(self):
        self.cartridge_state = cls.cartridge_state
        global number_of_refills
        self.number_of_refills = 0

    def write(self):
        print Pen.write(self)
        self.cartridge_state = "empty"
        return self.cartridge_state

    def refill(self):
        self.cartridge_state = "non-empty"
        self.number_of_refills += 1

クラス変数cartridge_stateを pep8 に準拠させ、このコードをエラーなしで動作させるにはどうすればよいですか?

4

3 に答える 3

5

クラス属性は、次の方法で読み取ることができますself

class FountainPen(object):
    cartridge_ink = "water-based"
    default_cartridge_state = "empty"

    @classmethod
    def toggle_default_cartridge_state(cls):
        if cls.default_cartridge_state == "empty":
            cls.default_cartridge_state = "non-empty"  
        else:
            cls.default_cartridge_state = "empty"

    def __init__(self):
        self.cartridge_state = self.default_cartridge_state

    def write(self):
        print Pen.write(self)
        self.cartridge_state = "empty"
        return self.cartridge_state

    def refill(self):
        self.cartridge_state = "non-empty"
        self.number_of_refills += 1
于 2012-06-19T13:33:02.737 に答える
1

PEP 8つまり、それはcls最初の引数であるべきです。selfインスタンスメソッドで最初の引数を定義するときと同じ方法。これは、このようなクラス メソッドを呼び出す際のトラブルを回避するためだと思いますself.yourclassmethod()@classmethodしかし、デコレータが必要な理由がわかりません。

編集:

@classmethod使用するのではなく、別の方法で行います@staticmethodが、同じことについて話しているわけではないことに気付きます。誰かが私が間違っていると信じているなら、教えてください。

例:

class Bar(object):
    @staticmethod
    def foo(myarg):
        return myarg * 2

Bar.foo(2)

編集2:

私は自分自身を修正し、さまざまなもの@classmethod@staticmethod表します (ここを参照)。静的メソッドは、クラスの変数を変更するべきではありません。

于 2012-06-19T13:24:04.813 に答える
0

忘れてくださいglobal; globalクラスやオブジェクトとは何の関係もありません。

オブジェクトのプロパティにアクセスすると、最初にオブジェクトで検索され、次にクラスで検索されます。つまり、オブジェクトにプロパティの独自のコピーを持たせ、そのプロパティへの後続の更新をクラスに反映させたくない場合は、次の場所にコピーするだけです__init__

def __init__(self):
    self.prop = self.prop
于 2012-06-19T13:47:19.733 に答える