質問
私は自分自身を教え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()
クラスメソッドは、下記リンク:
いることを確認して下さい 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
クラス定義のインスタンスのコースです。の方法の授業は、個々の場合がございます。のクラスメソッド(関数や変数)な場所に吊りその他の情報に関する設定のインスタンスに渡る。
たとえば、クラス定義の設定の生するたクラス変数をコントロールしたり、方法の定義の設定のグレードをするための教員ます。
も利用できるクラスメソッドを定義するツールの全体セットです。例えば学生です。all_of_em()が返すすべての学生です。ある場合設定のインスタンスしていよう設定することでクラスメソッドについて知る構造です。学生です。all_of_em(グレード='幅')
技術のことにつなが保管のセットのインスタンスをデータ構造に根ざしたクラス変数です。必要なものを避けるよう注意してください悔しいのガベージコレクションです。