- 论坛徽章:
- 0
|
# 此程序用于使用魔方方法访问、更改、删除实例属性
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
# 此为描述符将类的实例赋值给另一个类的变量
x = MyProperty(getX, setX, delX)
疑问1:在__get__(self, instance, owner)方法中,返回的是self.fget(instance),也就是用‘方法名(实例名)’的方式访问C的实例方法,但访问实例方法应该用‘实例名.方法名()'的方式访问才对,把self.fget(instance)改为instance.(self.fget())运行会报错,为什么?
疑问2::把__get__(self, instance, owner)方法中的self.fget(instance)改为instance.getX()就能正常运行,而用instance.self.fget()就会出错,但self.fget = getX,二者应该是等价的啊,应该都能运行才对。
|
|