0

私は Ruby から来て、Python が従う「暗黙的よりも明示的」な哲学に慣れてきましたが、実際にクラス メソッドを作成する方法について以前は混乱していました。ここで、次の点で私が本当に正しいことを確認したいと思います。

クラス内のすべてのメソッドは、本質的に Python のクラス メソッドです。

例えば:

class Employee(object):

    employeeCount = 0
    def __init__(self, name):
        self.name = name
        employeeCount += 1

    def get_name(self):
        return self.name

    def get_employee_count():
        return employeeCount

これが正しいと理解できれば、たとえばdavid = Employee("david")次の 2 つは同等です。

david.get_name()Employee.get_name(david)get_employee_count同様に、もクラス メソッドであると言えますが、どのインスタンスにも依存しないため、インスタンスを渡さないのは理にかなっています。これが、 type が意味をなさない理由ですdavid.get_employee_count()。なぜなら、これは になるEmployee.get_employee_count(david)からですがget_employee_count、パラメーター、つまりインスタンスを取り込まないからです。これは、タイプするだけであると結論付けていEmployee.get_employee_count()ます。

私の考えは正しいですか?ありがとうございました。

4

2 に答える 2

2

いいえ、あなたはまったく正しくありません。インスタンス メソッドではなくクラス メソッドにするためには、classmethodデコレータを使用する必要があります。そして、そのメソッドは引き続きパラメーターを取りますが、そのパラメーターはインスタンスではなくクラスです。そう:

@classmethod
def get_employee_count(cls):
    return cls.employeeCount

Python では、クラスは実際にはクラス内でブロック スコープを定義しないためemployeeCount、メソッド内で を参照するだけでは機能しません。そのため、clsparam が使用されます。

明確にするために、デコレータは単に関数のラッパーです-次のように書くこともできます

def _get_employee_count(cls):
    return cls.employeeCount
get_employee_count = classmethod(_get_employee_count)

組み込みclassmethod関数です。

また、Python では (Ruby でも考えていたように)、通常は のような単純な変数のアクセサを記述せず、name直接アクセスするだけであることに注意してください。

于 2013-10-14T20:39:00.653 に答える
0

真実。オブジェクトのインスタンスを処理する関数はself、そのパラメーターに含める必要があります。それ以外の場合は、クラス メソッドと見なされます。

編集

クラスメソッドは静的メソッドを意味しません! クラス関数の@staticmethod開始前にデコレータを追加しない限り、それらは静的メソッドではありませんdef

于 2013-10-14T20:31:50.270 に答える