[解決済み] Pythonでクラスのメンバ変数にアクセスする?
質問
class Example(object):
def the_example(self):
itsProblem = "problem"
theExample = Example()
print(theExample.itsProblem)
クラスの変数にアクセスするにはどうしたらいいですか? この定義を追加してみました。
def return_itsProblem(self):
return itsProblem
しかし、これも失敗です。
解決方法は?
その答えを一言で言うと
あなたの例では
itsProblem
はローカル変数です。
を使用する必要があります。
self
を使用してインスタンス変数を設定および取得します。設定するのは
__init__
メソッドを使用します。そうすると、あなたのコードはこうなります。
class Example(object):
def __init__(self):
self.itsProblem = "problem"
theExample = Example()
print(theExample.itsProblem)
しかし、真のクラス変数が欲しいのであれば、クラス名を直接使ってください。
class Example(object):
itsProblem = "problem"
theExample = Example()
print(theExample.itsProblem)
print (Example.itsProblem)
しかし、これには注意が必要です。
theExample.itsProblem
と同じになるように自動的に設定されます。
Example.itsProblem
が、全く同じ変数ではなく、独立して変更することが可能です。
いくつかの説明
Pythonでは、変数を動的に作成することができます。そのため、以下のようなことが可能です。
class Example(object):
pass
Example.itsProblem = "problem"
e = Example()
e.itsSecondProblem = "problem"
print Example.itsProblem == e.itsSecondProblem
印刷物
真
したがって、これまでの例と全く同じことをするわけです。
確かに、Pythonでは
self
として
this
が、もう少しだけ。
self
は、どのようなオブジェクトメソッドでも最初の引数は常にオブジェクト参照だからです。これは自動的で、あなたがそれを
self
を使うかどうかです。
ということは、できるんですね。
class Example(object):
def __init__(self):
self.itsProblem = "problem"
theExample = Example()
print(theExample.itsProblem)
または
class Example(object):
def __init__(my_super_self):
my_super_self.itsProblem = "problem"
theExample = Example()
print(theExample.itsProblem)
全く同じです。
ANYオブジェクトメソッドの第1引数は現在のオブジェクトであり、我々はそれを呼び出すだけです。
self
という慣例があります。
そして、このオブジェクトにただの変数を追加するのですが、これは外からやるのと同じ方法です。
さて、クラス変数についてです。
するとき。
class Example(object):
itsProblem = "problem"
theExample = Example()
print(theExample.itsProblem)
最初に クラス変数を設定します。 にアクセスし、次に オブジェクト (インスタンス) 変数 . このオブジェクト変数を設定したことはないのですが、動作しています。
Pythonはまずオブジェクト変数を取得しようとしますが、見つからなければクラス変数を渡します。 警告: クラス変数はインスタンス間で共有され、オブジェクト変数は共有されません。
結論として、クラス変数を使ってオブジェクト変数にデフォルト値を設定することは絶対にしないでください。使用方法
__init__
を使用します。
やがて、Pythonのクラスはインスタンスであり、したがってオブジェクトそのものであることを学ぶと、上記の理解に新たなヒントを与えてくれるでしょう。そのことに気づいたら、後でまたこれを読みに来てください。
関連
-
PicgoのイメージベッドツールをPythonで実装する
-
[解決済み】numpyの配列連結。"ValueError:すべての入力配列は同じ次元数でなければならない"
-
[解決済み] for'ループでインデックスにアクセスする?
-
[解決済み] 関数内でグローバル変数を使用する
-
[解決済み] PandasでDataFrameの行を反復処理する方法
-
[解決済み] 最小限の驚き」と「変更可能なデフォルトの引数
-
[解決済み] Python 3で「1000000000000000 in range(1000000000000001)」はなぜ速いのですか?
-
[解決済み] Pythonで静的なクラス変数は可能ですか?
-
[解決済み】ネストされたディレクトリを安全に作成するには?
-
[解決済み】Pythonに三項条件演算子はありますか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Python機械学習Githubが8.9Kstarsに達したモデルインタープリタLIME
-
PythonでECDSAを実装する方法 知っていますか?
-
[解決済み】RuntimeWarning: 割り算で無効な値が発生しました。
-
[解決済み] データ型が理解できない
-
[解決済み】OSError: [WinError 193] %1 は有効な Win32 アプリケーションではありません。
-
[解決済み】csv.Error:イテレータはバイトではなく文字列を返すべき
-
[解決済み】Flask ImportError: Flask という名前のモジュールがない
-
[解決済み] 初心者のための@classmethodと@staticmethodの意味?[重複あり]
-
[解決済み] 自分」という言葉は何のためにあるのか?
-
[解決済み】Pythonのメソッド内で「静的」クラス変数にアクセスするにはどうすればいいですか?