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

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__': , '__module__': '__main__', ' __weakref__': , 'feather': True, '__doc__': None}

{'fly': False, '__module__': '__main__', '__doc__': None , '__init__': }

{'age': 2}

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

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

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

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

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

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

summer.__dict__['age'] = 3
print(summer.__dict__['age'])
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 > 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;<--init&#39;
    def getNeg(self):
print &#39;<--getNeg&#39;
return self.value * -1
    def setNeg(self, value):
print &#39;<--setNeg&#39;
self.value = (-1) * value
    def delNeg(self):
print("value also deleted")
del self.value
    neg = property(getNeg, setNeg, delNeg, "I&#39;m negative")
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 > 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 までご連絡ください。
Python:ゲーム、GUIなどPython:ゲーム、GUIなどApr 13, 2025 am 12:14 AM

PythonはゲームとGUI開発に優れています。 1)ゲーム開発は、2Dゲームの作成に適した図面、オーディオ、その他の機能を提供し、Pygameを使用します。 2)GUI開発は、TKINTERまたはPYQTを選択できます。 TKINTERはシンプルで使いやすく、PYQTは豊富な機能を備えており、専門能力開発に適しています。

Python vs. C:比較されたアプリケーションとユースケースPython vs. C:比較されたアプリケーションとユースケースApr 12, 2025 am 12:01 AM

Pythonは、データサイエンス、Web開発、自動化タスクに適していますが、Cはシステムプログラミング、ゲーム開発、組み込みシステムに適しています。 Pythonは、そのシンプルさと強力なエコシステムで知られていますが、Cは高性能および基礎となる制御機能で知られています。

2時間のPython計画:現実的なアプローチ2時間のPython計画:現実的なアプローチApr 11, 2025 am 12:04 AM

2時間以内にPythonの基本的なプログラミングの概念とスキルを学ぶことができます。 1.変数とデータ型、2。マスターコントロールフロー(条件付きステートメントとループ)、3。機能の定義と使用を理解する4。

Python:主要なアプリケーションの調査Python:主要なアプリケーションの調査Apr 10, 2025 am 09:41 AM

Pythonは、Web開発、データサイエンス、機械学習、自動化、スクリプトの分野で広く使用されています。 1)Web開発では、DjangoおよびFlask Frameworksが開発プロセスを簡素化します。 2)データサイエンスと機械学習の分野では、Numpy、Pandas、Scikit-Learn、Tensorflowライブラリが強力なサポートを提供します。 3)自動化とスクリプトの観点から、Pythonは自動テストやシステム管理などのタスクに適しています。

2時間でどのくらいのPythonを学ぶことができますか?2時間でどのくらいのPythonを学ぶことができますか?Apr 09, 2025 pm 04:33 PM

2時間以内にPythonの基本を学ぶことができます。 1。変数とデータ型を学習します。2。ステートメントやループの場合などのマスター制御構造、3。関数の定義と使用を理解します。これらは、簡単なPythonプログラムの作成を開始するのに役立ちます。

プロジェクトの基本と問題駆動型の方法で10時間以内にコンピューター初心者プログラミングの基本を教える方法は?プロジェクトの基本と問題駆動型の方法で10時間以内にコンピューター初心者プログラミングの基本を教える方法は?Apr 02, 2025 am 07:18 AM

10時間以内にコンピューター初心者プログラミングの基本を教える方法は?コンピューター初心者にプログラミングの知識を教えるのに10時間しかない場合、何を教えることを選びますか...

中間の読書にどこでもfiddlerを使用するときにブラウザによって検出されないようにするにはどうすればよいですか?中間の読書にどこでもfiddlerを使用するときにブラウザによって検出されないようにするにはどうすればよいですか?Apr 02, 2025 am 07:15 AM

fiddlereveryversings for the-middleの測定値を使用するときに検出されないようにする方法

Python 3.6にピクルスファイルをロードするときに「__Builtin__」モジュールが見つからない場合はどうすればよいですか?Python 3.6にピクルスファイルをロードするときに「__Builtin__」モジュールが見つからない場合はどうすればよいですか?Apr 02, 2025 am 07:12 AM

Python 3.6のピクルスファイルのロードレポートエラー:modulenotFounderror:nomodulenamed ...

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

AtomエディタMac版ダウンロード

AtomエディタMac版ダウンロード

最も人気のあるオープンソースエディター

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強力な PHP 統合開発環境

SublimeText3 中国語版

SublimeText3 中国語版

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

WebStorm Mac版

WebStorm Mac版

便利なJavaScript開発ツール

VSCode Windows 64 ビットのダウンロード

VSCode Windows 64 ビットのダウンロード

Microsoft によって発売された無料で強力な IDE エディター