2017-03-16 4 views
0

私は非常に新しいPythonです。これは愚かな質問ですが、これまで私は正常にグーグルできませんでした。Pythonのオブジェクトではなく書き込まれたクラスのメソッドを呼び出す

私はCookieと呼ばれるクラスを作成しており、作成されたクッキーの数を返し、それらをリセットするメソッドを持っています。私が問題を抱えているのは、クラスから作成されたオブジェクトではなく、実際のクラスのクラスメソッドを呼び出すテストです。 IE:

代わりに:彼らはテストで使用

c = Cookie() 
c.count() 

Cookie.count() 

カウントはクッキークラスのメソッドですが、クッキーがオブジェクトではありません。これまで私は、クラスによって作成されたオブジェクトの上に、クラス内のメソッドを呼び出すことに成功していませんでした。私は常にオブジェクトを作成するためのテンプレートとしてクラスを考えてきました。誰もこれを説明できますか?ありがとうございました。

What I Have

Tests

+0

にのみ可能する必要があること(例えば私の例ではカウンタ対数など)と同じ名前空間の他のものと衝突変数の命名については、もう少し注意する必要があります'@ staticmethod'(または' @classmethod') – UnholySheep

+0

'classmethod'や' staticmethod'デコレータを使うことも、モジュールレベルの関数を使うこともできます。 –

+0

Pythonは 'classmethod'を持っています...そのクラスで作成された' Cookie'オブジェクトの数を数えますか? – tdelaney

答えて

0

た私が過去ここますが、コードを見て取った後、[OK]を:あなたは、多くの問題を持っている

class Cookie(object): 
    global count 
    count = 0 

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

    def count(): 
     print(count) 

    def reset_counter(): 
     count = 0 
     return count 

1つは、クラスオブジェクトの本体の中に、グローバル変数としてcountを宣言しています。

さらに、countという機能があります。

これはいくつかの重大な問題につながります。

ウォッチ:

In [8]: Cookie 
Out[8]: __main__.Cookie 

In [9]: count 
Out[9]: <function __main__.count> 

In [10]: 

私は何をあなたが行きたいと、オブジェクトがインスタンス化される頻度を追跡することだと思います。

これを達成するには、グローバルを必要とせず、物事を混乱させるだけです。

In [18]: class Cookie(object): 
    ...:  counter = 0 
    ...: 
    ...:  def __init__(self): 
    ...:   Cookie.counter += 1 
    ...: 
    ...:  @classmethod 
    ...:  def count(cls): 
    ...:   print(Cookie.counter) 

    ...:  @classmethod 
    ...:  def reset_counter(cls): 
    ...:   Cookie.counter = 0 
    ...:   return Cookie.counter 
    ...:  

In [19]: c=Cookie() 

In [20]: Cookie.count() 
1 

In [21]: c=Cookie() 

In [22]: Cookie.count() 
2 

はまた、それがある場合

+0

ありがとう! –

1

このコードは、クラスのオブジェクトにカウンタを保持し、それをクラスがインスタンス化されるたびにインクリメントします。クラスメソッドは、クラスオブジェクトへの参照を取得して、num_cookiesを見つけることができます。また、クラスインスタンス内のselfオブジェクトを介して呼び出し可能であるため、複数の方法でそれらにアクセスできます。

class Cookie: 

    num_cookies = 0 

    @classmethod 
    def count(cls): 
     return cls.num_cookies 

    @classmethod 
    def add_cookie(cls): 
     cls.num_cookies += 1 

    def __init__(self): 
     self.add_cookie() 

print(Cookie.count()) 
print(Cookie().count()) 
+0

それはまさに私があなたにはあまりにもありがたいことを理解しようとしてきたことでした。 –

+0

これを指摘していただきありがとうございます、私はそれを行うことを知っていませんでした。私は緑色のチェックマークを付けました、それはそれを受け入れていますか? –

関連する問題