ホームページ  >  記事  >  バックエンド開発  >  Python の高度な __attr__ オブジェクト属性

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

巴扎黑
巴扎黑オリジナル
2016-12-08 09:29:531332ブラウズ

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

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

{'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 までご連絡ください。