例:
class test:
def __init__(self):
self.__name=None
@myproperty
def name(self):
return self.__name
@name.setter
def name(self,value):
if value < 0:
print('no')
return
self.__name=value
注释:类myproperty中各参数指什么
方法函数中传入的第一个参数self 是 name(也就是@myproperty 下面的函数name)
@myproperty 定义完name函数之后,会自动运行property中的构造函数__init__
@name.setter 运行name.setter函数,参数:self=name #第一个name setx=test.name (同理:getx=test.name #@name.getter 下面的那个name函数)
setter函数中的: return type(self)(self.getx, setx, self.delx, self.__doc__) 相当于: myproperty(text.name) #此时,除了setx外,其余的都仍是None (因为我在例子中没有定义其余的)
setter ,getter 这两个函数的作用是:定义类对象中的函数,使原函数名具有新的作用,
当在交互模式中出现:
类名.name ——> 运行name.__get__函数,实参instance=类对象, owner=类 #print(owner): 也相当于类对象的类型
返回值 self.getx(instance) 相当于: test.name(t) #注意,这里虽然和下文中都是test.name, 只是因为方便大家理解,这两个name并不是同一个,计算机看到的也是getx和setx,会自动区分
类名.name=xxx ——> 运行name.__set__函数,value=xxx
返回值 return self.setx(instance,value) 相当于: test.name(t, xxx)
__get__, __set__ 这两个函数的作用是:在返回值中调用原函数
至于为什么python看到 test.name=xxx 就会调用__get__ 我想不通,有知道的希望告诉我一下