- 論壇徽章:
- 0
|
# 此程序用于使用魔方方法訪問、更改、刪除實(shí)例屬性
class MyProperty:
def __init__(self, fget=None, fset=None, fdel=None):
self.fget = fget
self.fset = fset
self.fdel = fdel
def __get__(self, instance, owner):
name=self.fget
print('name=', name)
return name(instance)
def __set__(self, instance, value):
self.fset(instance, value)
def __delete__(self, instance):
self.fdel(instance)
class C:
def __init__(self):
self._x = None
def getX(self):
return self._x
def setX(self, value):
self._x = value
def delX(self):
del self._x
# 此為描述符將類的實(shí)例賦值給另一個(gè)類的變量
x = MyProperty(getX, setX, delX)
疑問1:在__get__(self, instance, owner)方法中,返回的是self.fget(instance),也就是用‘方法名(實(shí)例名)’的方式訪問C的實(shí)例方法,但訪問實(shí)例方法應(yīng)該用‘實(shí)例名.方法名()'的方式訪問才對(duì),把self.fget(instance)改為instance.(self.fget())運(yùn)行會(huì)報(bào)錯(cuò),為什么?
疑問2::把__get__(self, instance, owner)方法中的self.fget(instance)改為instance.getX()就能正常運(yùn)行,而用instance.self.fget()就會(huì)出錯(cuò),但self.fget = getX,二者應(yīng)該是等價(jià)的啊,應(yīng)該都能運(yùn)行才對(duì)。
|
|