Python 記述子記述子(2)

黄舟
黄舟オリジナル
2016-12-23 17:38:571291ブラウズ

python内部の記述符

pythonにはいくつかの内部配置の記述符オブジェクト、PROperty、staticmethod、classmethod、python实现如下:

class Property(object):
def __init__(self,getf,setf,delf,doc):
self.getf=getf
self.setf=setf
self.delf=delf
self.doc=doc
def __get__(self,instance,own=None):
インスタンスが None の場合:
return self
if self.getf is None:
raise AttributeError
return self.getf(instance)
def __set__(self,instance,value):
self.setf が None の場合:
raise AttributeError
self.setf(インスタンス,値)
def __del__(self ,instance):
self.delf が None の場合:
raise AttributeError
self.delf(instance)
class StaticMethod(object):
def __init__(self,func):
self.f unc=func
def __get__(self, instance,own=None):
return self.func
class ClassMethod(object):
def __init__(self,func):
self.func=func
def __get__(self,instance,own=None):
if own is None:
own=type(instance)
def callfunc(*args):
return self.func(own,*args)
return callfunc

はプロパティ值设置别名

有時候你想用一个属性名別のプロパティ名の別名として、あるプロパティを設定する場合には必ず承認値が必要であり、他のプロパティの現在の値も同様であり、独立した設定と削除も必要です。

self.name=name

def __get__(self,instance,own):
インスタンスが None の場合: #类属性访问時
return self
return getattr(instance,self.name).title()
クラス 人(オブジェクト):
def __init__(self,name,aliasname=None):
self.name=name
aliasname が None でない場合:
self.aliasname=aliasname
aliasname=DefaultAlias('name')
> >> p=人('サム')
>>> p.aliasname
'Sam'
>>> p.aliasname='ジャック'
>>> p.aliasname
'jack'
>>> del p.aliasname
>>> p.aliasname
'Sam'

これは、プロパティ名に別名エイリアス名が設定されるか、またはエイリアス名の値が了名に保存されます。DefaultAlias は、__set__ メソッドがないため、データ記述子ではありません。非データ記述子。そのため、サンプルのプロパティ値を設定するとき (p.aliasname='jack')、サンプルは通常のようにプロパティを認識し、サンプルのプロパティはタイプのプロパティをオーバーライドします。 name プロパティは影響を受けません。p.aliasname を削除すると、例のプロパティが削除され、クラスのプロパティが再び表示される可能性があります。来命名のメソッドとプロパティは、古い名前の有用性を維持します。

class OldAlias(object):
def __init__(self,name,oldname):
self.name=name
self.oldname=oldname
def _warn(self):
print '%r ではなく %r を使用'%( self.name,self.oldname)
def __get__(self,instance,own):
self._warn()
インスタンスが None の場合:
return getattr(instance, self.name) def __set__(self,instance,value) :
self._warn() object):
def __init__(self,newname):
self.newname=newname
oldname=OldAlias('newname','oldname')
>>> a')
>> ;> c.oldname
use 'newname',not 'oldname'
'a'


このクラスを使用する古いコードはクラス属性 oldname を使用し、警告メッセージが出力されます。ユーザーに新しい属性 newname を使用するよう勧めます。

属性値のキャッシュ

要件に基づいてインスタンス属性またはクラス属性の値を計算し、自動キャッシュを提供します。

class CachedAttribute(object):

def __init__(self,method,name=None):

self.method=method

self.name=name if name else method.__name__

def __get__(self,instance,own): C iF インスタンスは None:

Return Self

Result = Self.Method (Instance)

Setattr (Instance, Self.name, Result) Return Result
Class MyObject (Object): I DEF __init __ (Self, N):
Self .n=n
@CachedAttribute
def square(self):
return self.n*self.n
>>> m=MyObject(2)>>> m.square
4
> ;>> m.n=5
>>> m.square
>>> 初回訪問時 m.square .square の後、square 属性はインスタンス m にキャッシュされます。インスタンス属性 n が変更されても、square 属性は変更されません。キャッシュをクリアする必要がある場合は、del m.square を実行してください。m.square 属性 square に再度アクセスすると、square の値が再計算されます。

キャッシュクラス属性:

class CachedClassAttribute(CachedAttribute):
def __get__(self,instance,own):
return super(CachedClassAttribute,self).__get__(own,own)
class MyClass(object):
class_attr= 24
@CachedClassAttribute
def square(cls):
return cls.class_attr*cls.class_attr


このクラスのすべてのインスタンスは同じキャッシュされた値を持ちます:

>>> a=MyClass()

> >> b=MyClass()

>>> a.square

>>> > print MyClass.square


上記は Python 記述子記述子 (2) の内容です。さらに関連する内容については、PHP 中国語 Web サイト (www.php.cn) に注目してください。




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