質問

私は自分自身を教えPython、最近のレッスンでしたが PythonではないJava, なんだかでなめらかな仕上がりですべての私のクラスメソッドへ。

私は今、こんなクラスを使用方法も行ってい static 法Javaばかりでしたが、今はもっぱらいがいします。すべての助言で約Pythonのクラスメソッドは、初心者の私には必要かし、標準の文書の中では不透明できます。

いては、例えばクラスのメソッドをPythonではない場合クラスメソッドを識別できる。

役に立ちましたか?

解決

クラスの方法と必要な時に必要に方法はない特有の特定のインスタンスが関与のクラスもあります。最も興味深いものについては、そのオーバーライドできるサブクラスというのは、とても単にできませんJavaのstaticメソッドはPythonのモジュールレベルで機能する。

またクラス MyClass, では、モジュールレベルの機能が動作すMyClass(工場では、依存関係の射出スタブなど)で classmethod.のように利用できるサブクラス.

他のヒント

ファクトリメソッド(オルトコンストラクタは実際の典型例クラス。

基本的には、クラスメソッドが適していつでもいい方法にすることはもちろんの名前空間のクラスのものに関連付けられていない特定のインスタンスのクラスです。

一例として、優れた unipath モジュール:

現在のディレクトリ

  • Path.cwd()
    • 戻り、実際の現在のディレクトリ;例えば、 Path("/tmp/my_temp_dir").クラスです。
  • .chdir()
    • を自己の現在のディレクトリです。

現在のディレクトリは、工程の広さで、 cwd メソッドは何も行いませんが特定のインスタンスでは関連付けます。しかし、変化するの cwd のディレクトリの指定 Path インスタンスは実にするインスタンス方法。

う~ん...として Path.cwd() は実際に返す Path インスタンスうるものと考えられるとするファクトリメソッド...

考えるとこのようになっております:通常の方法に有用な非表示の派遣:することができま myobj.foo() を気にせずにいかどうかについて foo() メソッドの実装を myobj オブジェクトのクラスまたはその親会社。クラスメソッドは完全に類似すが、クラスオブジェクトではなく:いま話 MyClass.foo() ないかどうかについて foo() の実施による特別 MyClass が必要になった独自の専門版るのか、あるいはさせ、その親クラスの取扱いしてから通報してください。

クラスメソッドで欠かすことのできない確認することができまの設定または計算を行うことで、 の作成、実際のインスタンスでは、インスタンスの存在を明らかにできない、インスタンスを使用しての派遣インドキュメンタリーに発信します。良い例することとなりますSQLAlchemyソースコードの dbapi() クラスメソッドは、下記リンク:

https://github.com/zzzeek/sqlalchemy/blob/ab6946769742602e40fb9ed9dde5f642885d1906/lib/sqlalchemy/dialects/mssql/pymssql.py#L47

いることを確認して下さい dbapi() 方法は、データベースバックエンドの使用をインポートするにはベンダー固有のデータベース図書館でマンは、クラスメソッドでニーズの実行 インスタンスの特定のデータベース接続を取得する開始の作成ができますが、簡単な機能あるいは静的な機能が欲しいかを呼び出すことができるのは、支援方法も同様に必要とする筆記具体的には、サブクラスにより親クラスです。ま派遣または関数への静的クラスは、その"忘れや紛失についての知識できるクラスを初期化.

って欲しいという非常に軽量なロギングのクラスが出力変量の出力によってはレベルのログ処理できるプログラムにセットです。がんへのインスタンスを生成のクラスは毎回たかったのを出力デバッグメッセージやエラーや警告が表示されます。がたいという思いもありました封止の機能がこのログイン施設でリユースの宣言のグローバル変数.

で使用したクラス変数の @classmethod デコレータです。

私は簡単ログインクラスってください

Logger._level = Logger.DEBUG

そして、コードから吐き出しアイテムの学習プログレスをデバッグ情報を、このことによってコード

Logger.debug( "this is some annoying message I only want to see while debugging" )

誤差が出力付

Logger.error( "Wow, something really awful happened." )

の"生産"環境を指定できま

Logger._level = Logger.ERROR

現在のエラーメッセージを出力します。デバッグメッセージは印刷済。

ここでの私のクラス:

class Logger :
    ''' Handles logging of debugging and error messages. '''

    DEBUG = 5
    INFO  = 4
    WARN  = 3
    ERROR = 2
    FATAL = 1
    _level = DEBUG

    def __init__( self ) :
        Logger._level = Logger.DEBUG

    @classmethod
    def isLevel( cls, level ) :
        return cls._level >= level

    @classmethod
    def debug( cls, message ) :
        if cls.isLevel( Logger.DEBUG ) :
            print "DEBUG:  " + message

    @classmethod
    def info( cls, message ) :
        if cls.isLevel( Logger.INFO ) :
            print "INFO :  " + message

    @classmethod
    def warn( cls, message ) :
        if cls.isLevel( Logger.WARN ) :
            print "WARN :  " + message

    @classmethod
    def error( cls, message ) :
        if cls.isLevel( Logger.ERROR ) :
            print "ERROR:  " + message

    @classmethod
    def fatal( cls, message ) :
        if cls.isLevel( Logger.FATAL ) :
            print "FATAL:  " + message

一部のコード試験でもトップビット:

def logAll() :
    Logger.debug( "This is a Debug message." )
    Logger.info ( "This is a Info  message." )
    Logger.warn ( "This is a Warn  message." )
    Logger.error( "This is a Error message." )
    Logger.fatal( "This is a Fatal message." )

if __name__ == '__main__' :

    print "Should see all DEBUG and higher"
    Logger._level = Logger.DEBUG
    logAll()

    print "Should see all ERROR and higher"
    Logger._level = Logger.ERROR
    logAll()

代替コンストラクタのクラシックます。

と思い、最も明確な答えは AmanKowの ます。をあげたどのようにできると思いを整理しておきます。すべてのモジュールレベルの機能に包まれた名前空間のモジュールのi.e

module.py (file 1)
---------
def f1() : pass
def f2() : pass
def f3() : pass


usage.py (file 2)
--------
from module import *
f1()
f2()
f3()
def f4():pass 
def f5():pass

usage1.py (file 3)
-------------------
from usage import f4,f5
f4()
f5()

上記の手続き上のコードがないものとなっていますが、後の3つのモジュールで干の混乱をもたらすでしょうが、何がそれぞれの方法。利用できる長さの記述名のための機能をjava)もコードが手に負え非常に迅速にできます。

のオブジェクト指向方法は下おコードを管理可能なブロックん。eク&ブ機能をオブジェクトに関連付けられますインスタンスはます。

クラスの機能を取得すれば他の部門コードに比べてモジュールレベルで機能する。できるグループ関連の機能をクラスを、そして特定のタスクのときに割り当てられているクラスです。例えばファイルを作成しますユーティリティクラス:

class FileUtil ():
  def copy(source,dest):pass
  def move(source,dest):pass
  def copyDir(source,dest):pass
  def moveDir(source,dest):pass

//usage
FileUtil.copy("1.txt","2.txt")
FileUtil.moveDir("dir1","dir2")

この方法はより柔軟かつ維持、グループ機能や、より明白などの各機能です。また、防名の紛争は、例えば、コピー機能が存在する可能性が指摘されて別の輸入モジュール(例えば、ネットワークコピー)をご利用のコードでご利用の際は、氏名FileUtil.copy()を取り外すの問題との両方のコピー機能をご利用いただくことができます。

ユーザーがログに自分のページでは、ユーザ()オブジェクトのインスタンスを生成からユーザー名とパスワードを発行いたします。

だが必要なユーザオブジェクトのユーザがログイン(例えばユーザーが削除したい他のユーザーアカウントしたいインスタンスを生成するユーザーと呼び、その削除方法):

私はクラスメソッドを鷲掴みにし、ユーザオブジェクトです。

class User():
    #lots of code
    #...
    # more code

    @classmethod
    def get_by_username(cls, username):
        return cls.query(cls.username == username).get()

    @classmethod
    def get_by_auth_id(cls, auth_id):
        return cls.query(cls.auth_id == auth_id).get()

正直?ことがなかった利用のためのstaticmethodはclassmethod.今では操作できないを使用して行ったグローバル関数またはインスタンス方法。

こ異なる場合はpython用の個人保護委員ようなJavaます。Java、必要なstaticメソッドにアクセスできるインスタンスの個人員がいます。Pythonでは、そのほとんどかかりません。

通常、使っている人を見staticmethodsとclassmethodsがいなpythonのモジュールレベルの名前空間です。

できる書汎用クラスメソッド利用できる任意の対応のクラスです。

例えば:

@classmethod
def get_name(cls):
    print cls.name

class C:
    name = "tester"

C.get_name = get_name

#call it:
C.get_name()

組み合わせて使用しない場合は @classmethod 行うことができるので自己のキーワードが必要でインスタンスのクラス:

def get_name(self):
    print self.name

class C:
    name = "tester"

C.get_name = get_name

#call it:
C().get_name() #<-note the its an instance of class C

私は使用されているPHPは、そうこうしているうちに、やっとというのはチとなっているこclassmethod?Pythonのマニュアルは技術的、非常に短い言葉なのでそもそも太陽系と理解が特徴です。またgooglingとgooglingの見解答-> http://code.anjanesh.net/2007/12/python-classmethods.html.

ごゆったり流れるクリックします。私の説明が短います。:)

PHPでもないPHPが、この言語で直進くべきかい)を静的変数のようになります:


class A
{

    static protected $inner_var = null;

    static public function echoInnerVar()
    {
        echo self::$inner_var."\n";
    }

    static public function setInnerVar($v)
    {
        self::$inner_var = $v;
    }

}

class B extends A
{
}

A::setInnerVar(10);
B::setInnerVar(20);

A::echoInnerVar();
B::echoInnerVar();

を出力する場合は20.

しかしpythonにおける当社ブログにアクセスいただき@classmethodデコレータは、このようにすることができるようになり出力10、20ます。例:


class A(object):
    inner_var = 0

    @classmethod
    def setInnerVar(cls, value):
        cls.inner_var = value

    @classmethod
    def echoInnerVar(cls):
        print cls.inner_var


class B(A):
    pass


A.setInnerVar(10)
B.setInnerVar(20)

A.echoInnerVar()
B.echoInnerVar()

スマート,how?

クラスメソッドを提供"の意味砂糖"(知らない場合はこの期間では広く使用)または"意味的な利便性".

例:またセットの授業を表すオブジェクト。するためのクラスメソッド all() または find()User.all() または User.find(firstname='Guido').これを使ってモジュールレベルの機能はもちろ---

何で僕らは、Ruby、いわゆる クラス 方法で インスタンス 方法はただの機能と意味の意味の応用の最初のパラメータは、黙々と渡された場合に 機能 と呼ばれる方法としての オブジェクトobj.meth()).

通常る オブジェクト でなければなインスタンスが @classmethod 方法デコレータ 変更のルールに渡すクラスです。話ができ、クラスメソッドは、インスタンス(あと機能)-最初のargymentができます。

でん 機能, それを宣言した一定範囲( class ません。場合は以下のことには驚きるRubyist、 できないクラスメソッドおよびインスタンスメソッドと同じ名前.

このことを考え:

class Foo():
  def foo(x):
    print(x)

話ができ foo にインスタンス

Foo().foo()
<__main__.Foo instance at 0x7f4dd3e3bc20>

がクラス:

Foo.foo()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unbound method foo() must be called with Foo instance as first argument (got nothing instead)

今追加 @classmethod:

class Foo():
  @classmethod
  def foo(x):
    print(x)

メインスタンス現在のパスクラス:

Foo().foo()
__main__.Foo

そして要求するクラス:

Foo.foo()
__main__.Foo

この条約に至るま self その第一引数にインスタンス法 cls プロセスな方法です。使用したものはこちらを説明することで引数に使います。Ruby, self キーワードとなります。

トルビー:

class Foo
  def foo()
    puts "instance method #{self}"
  end
  def self.foo()
    puts "class method #{self}"
  end
end

Foo.foo()
class method Foo

Foo.new.foo()
instance method #<Foo:0x000000020fe018>

Pythonのクラスメソッドはただの 装飾機能 使用可能になるのと同じ手法 自分でデコレータ.装飾した方法でラップの方法の場合 @classmethod では、追加のクラスの引数).基本となるメソッドがありますが、やはり、隠された がまだアクセス.


脚注:わたしは、この後、名前の衝突との間にクラスのインスタンス法に興味を持ち.私からPythonの専門家のようなコメントする場合のそれは間違いである。

これは興味深い話題です。私にではpython classmethod動のように単独ではなく工場を返しまれたクラスのインスタンス).その理由はシングルトンは共通であるオブジェクトが生成の辞書で一度だけクラスで共通う場合がございます。

これを説明するためにここでは一例です。全てのインスタンスを参照する辞書です。このパターン工場として理解しています。これは非常に独特のエラーになります。

class M():
 @classmethod
 def m(cls, arg):
     print "arg was",  getattr(cls, "arg" , None),
     cls.arg = arg
     print "arg is" , cls.arg

 M.m(1)   # prints arg was None arg is 1
 M.m(2)   # prints arg was 1 arg is 2
 m1 = M()
 m2 = M() 
 m1.m(3)  # prints arg was 2 arg is 3  
 m2.m(4)  # prints arg was 3 arg is 4 << this breaks the factory pattern theory.
 M.m(5)   # prints arg was 4 arg is 5

ったというのは同じ質問を投げかけました。もののうちに努め、アドボカシーを説明するたぁの最良の答えは(もっとも単純な方法で解答していたが、 説明 のクラスメソッドは、Pythonドキュメント.

も参考に静的な方法です。場合には誰かが既に分かっていインスタンス法(るい)、この回答が最後のピースを入れて---

さらに、より深い家は、今でもドキュメンテーション標準型の階層 (スクロールして、 インスタンスの方法 部)

クラス定義のインスタンスのコースです。の方法の授業は、個々の場合がございます。のクラスメソッド(関数や変数)な場所に吊りその他の情報に関する設定のインスタンスに渡る。

たとえば、クラス定義の設定の生するたクラス変数をコントロールしたり、方法の定義の設定のグレードをするための教員ます。

も利用できるクラスメソッドを定義するツールの全体セットです。例えば学生です。all_of_em()が返すすべての学生です。ある場合設定のインスタンスしていよう設定することでクラスメソッドについて知る構造です。学生です。all_of_em(グレード='幅')

技術のことにつなが保管のセットのインスタンスをデータ構造に根ざしたクラス変数です。必要なものを避けるよう注意してください悔しいのガベージコレクションです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top