ホームページ バックエンド開発 Python チュートリアル Python の高度な __attr__ オブジェクト属性

Python の高度な __attr__ オブジェクト属性

Dec 08, 2016 am 09:29 AM
python

Python のすべてのものはオブジェクトであり、各オブジェクトは複数の属性を持つことができます。 Python の属性には統一された管理スキームがあります。

オブジェクトの属性は、クラス属性と呼ばれるクラス定義から取得される場合があります。

クラス属性は、クラス定義自体から取得することも、クラス定義から継承することもできます。

オブジェクトの属性は、オブジェクト インスタンスによって定義することもでき、オブジェクト属性と呼ばれます。

オブジェクトのプロパティは、オブジェクトの __dict__ 属性に保存されます。

__dict__ は辞書で、キーは属性名、対応する値は属性そのものです。以下のクラスとオブジェクトを見てみましょう。

次のようなオブジェクトの属性を取得する Java のリフレクションに対応します:

public class UserBean {
    private Integer id;
    private int age;
    private String name;
    private String address;
}
//类实例化
UserBean bean = new UserBean();
bean.setId(100);
bean.setAddress("武汉");
//得到类对象
Class userCla = (Class) bean.getClass();
      
//得到类中的所有属性集合
Field[] fs = userCla.getDeclaredFields();
......
ログイン後にコピー
class bird(object):
    feather = True
class chicken(bird):
    fly = False
    def __init__(self, age):
        self.age = age
summer = chicken(2)
print(bird.__dict__)
print(chicken.__dict__)
print(summer.__dict__)
ログイン後にコピー

出力:

{'__dict__': <attribute '__dict__' of 'bird' オブジェクト>, '__module__': '__main__', ' __weakref__': <'bird' オブジェクトの属性 '__weakref__'>, 'feather': True, '__doc__': None}

{'fly': False, '__module__': '__main__', '__doc__': None , '__init__': <function __init__ at 0x2b91db476d70>}

{'age': 2}

最初の行は、羽毛などの鳥クラスの属性です。

2 行目は、fly メソッドや __init__ メソッドなどのチキン クラスの属性です。

3行目は夏オブジェクトの属性、つまり年齢です。

__doc__ などの一部の属性は私たちが定義したものではなく、Python によって自動的に生成されます。さらに、bird クラスには、オブジェクト クラスである親クラスもあります (bird の定義、クラス Bird(object) と同様)。このオブジェクト クラスは、Python のすべてのクラスの親クラスです。

つまり、サブクラスの属性は親クラスの属性をオーバーライドします。

次の 2 つのメソッドを通じてクラスのプロパティを変更できます:

summer.__dict__[&#39;age&#39;] = 3
print(summer.__dict__[&#39;age&#39;])
summer.age = 5
print(summer.age)
ログイン後にコピー

Python のプロパティ

同じオブジェクトの異なるプロパティ間に依存関係が存在する場合があります。プロパティが変更されると、そのプロパティに依存する他のプロパティも同時に変更する必要があります。現時点では、__dict__ を通じて属性を静的に保存することはできません。 Python には、オンザフライでプロパティを生成するいくつかの方法が用意されています。そのうちの 1 つはプロパティと呼ばれます。

class bird(object):
    feather = True
#extends bird class
class chicken(bird):
    fly = False
    def __init__(self, age):
        self.age = age
    def getAdult(self):
        if self.age &gt; 1.0: 
return True
        else: 
return False
    adult = property(getAdult)   # property is built-in
summer = chicken(2)
print(summer.adult)
summer.age = 0.5
print(summer.adult)
ログイン後にコピー

ここでの機能はトリガーに似ています。アダルト属性が取得されるたびに、getAdult の値がトリガーされます。

機能は、組み込み関数 property() を使用して作成されます。 property() は最大 4 つのパラメータをロードできます。最初の 3 つのパラメータは関数であり、それぞれクエリ特性の処理、特性の変更、特性の削除に使用されます。最後のパラメータは機能のドキュメントであり、説明用の文字列を指定できます。

class num(object):
    def __init__(self, value):
self.value = value
print &#39;&lt;--init&#39;
    def getNeg(self):
print &#39;&lt;--getNeg&#39;
return self.value * -1
    def setNeg(self, value):
print &#39;&lt;--setNeg&#39;
self.value = (-1) * value
    def delNeg(self):
print(&quot;value also deleted&quot;)
del self.value
    neg = property(getNeg, setNeg, delNeg, &quot;I&#39;m negative&quot;)
x = num(1.1)
print(x.neg)
x.neg = -22
print(x.value)
print(num.neg.__doc__)
del x.neg
ログイン後にコピー

プロセス全体を通じて、対応する関数は呼び出されませんでした。

つまり、neg 属性の作成、設定、削除はすべて property() を通じて登録されます。

Python 特別メソッド __getattr__ (これは一般的に使用されます)

__getattr__(self, name) を使用して、オンザフライで生成された属性をクエリできます。

Python では、オブジェクトの属性は動的であり、必要に応じていつでも属性を追加または削除できます。

そして、これらの属性を生成する際にレイヤーの判定処理を行うのがgetattrの機能です。

例:

class bird(object):
    feather = True
class chicken(bird):
    fly = False
    def __init__(self, age):
self.age = age
    def __getattr__(self, name):
if name == &#39;adult&#39;:
if self.age &gt; 1.0: 
return True
else: 
return False
else: 
raise AttributeError(name)
summer = chicken(2)
print(summer.adult)
summer.age = 0.5
print(summer.adult)
print(summer.male)
ログイン後にコピー

各機能には独自の処理関数が必要で、__getattr__ は同じ関数でインスタントに生成されたすべての属性を処理できます。 __getattr__ は、関数名に基づいてさまざまな属性を処理できます。たとえば、上記の属性名 Male をクエリすると、AttributeError が発生します。

(Python には __getattribute__ 特別なメソッドもあります。これは、任意の属性をクエリするために使用されます。

__getattr__ は、__dict__ システムにない属性をクエリするためにのみ使用できます)

__setattr__(self, name, value) および_ _delattr__(self, name) を使用して属性を変更および削除できます。

より幅広い用途があり、あらゆる属性に使用できます。


このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットな記事タグ

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

テンプレートのメリットとデメリットは何ですか? テンプレートのメリットとデメリットは何ですか? May 08, 2024 pm 03:51 PM

テンプレートのメリットとデメリットは何ですか?

Google AI、開発者向けに Gemini 1.5 Pro と Gemma 2 を発表 Google AI、開発者向けに Gemini 1.5 Pro と Gemma 2 を発表 Jul 01, 2024 am 07:22 AM

Google AI、開発者向けに Gemini 1.5 Pro と Gemma 2 を発表

Deepseek Xiaomiをダウンロードする方法 Deepseek Xiaomiをダウンロードする方法 Feb 19, 2025 pm 05:27 PM

Deepseek Xiaomiをダウンロードする方法

わずか 250 ドルで、Hugging Face のテクニカル ディレクターが Llama 3 を段階的に微調整する方法を教えます わずか 250 ドルで、Hugging Face のテクニカル ディレクターが Llama 3 を段階的に微調整する方法を教えます May 06, 2024 pm 03:52 PM

わずか 250 ドルで、Hugging Face のテクニカル ディレクターが Llama 3 を段階的に微調整する方法を教えます

いくつかの .NET オープンソース AI および LLM 関連プロジェクト フレームワークを共有する いくつかの .NET オープンソース AI および LLM 関連プロジェクト フレームワークを共有する May 06, 2024 pm 04:43 PM

いくつかの .NET オープンソース AI および LLM 関連プロジェクト フレームワークを共有する

golang 関数のデバッグと分析の完全ガイド golang 関数のデバッグと分析の完全ガイド May 06, 2024 pm 02:00 PM

golang 関数のデバッグと分析の完全ガイド

どうやって彼にdeepseekに尋ねますか どうやって彼にdeepseekに尋ねますか Feb 19, 2025 pm 04:42 PM

どうやって彼にdeepseekに尋ねますか

評価関数の保存方法 評価関数の保存方法 May 07, 2024 am 01:09 AM

評価関数の保存方法

See all articles