Discuss / Python / property工作流程参考

property工作流程参考

Topic source

一盒噪噪

#1 Created at ... [Delete] [Delete and Lock User]

(博主写的具有property功能的类,具体例子可查看原网址)

class myproperty(object):

    def __init__(self, getx=None, setx=None, delx=None, doc=None):

        self.getx = getx

        self.setx = setx

        self.delx = delx

        self.__doc__ = doc

    def getter(self, getx):

        return type(self)(getx, self.setx, slef.delx, self.__doc__)

    def setter(self, setx):

        return type(self)(self.getx, setx, self.delx, self.__doc__)

    def __get__(self, instance, owner):

        if self.getx:

            return self.getx(instance)

        return None

    def __set__(self, instance, value):

        if self.setx:

            return self.setx(instance,value)

--------------------- 

作者:潇垚 

来源:CSDN 

原文:https://blog.csdn.net/u010872995/article/details/50389213 

版权声明:本文为博主原创文章,转载请附上博文链接!

property属性的有两种方式

  • 装饰器 即:在方法上应用装饰器                                                    #如我们本章中的例子
  • 类属性 即:在类中定义值为property对象的类属性                     # x=property(getx, setx, delx, 'i am x')

property方法中有个四个参数

  • 第一个参数是方法名,调用 对象.属性 时自动触发执行方法 ===> fb.price
  • 第二个参数是方法名,调用 对象.属性 = XXX 时自动触发执行方法 ===> fb.price = 17
  • 第三个参数是方法名,调用 del 对象.属性 时自动触发执行方法 ===> del fb.price
  • 第四个参数是字符串,调用 对象.属性.doc ,此参数是该属性的描述信息

作者:DevOps海洋的渔夫

链接:https://www.jianshu.com/p/83a6bfae8b64

来源:简书

简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

一盒噪噪

#2 Created at ... [Delete] [Delete and Lock User]

例:

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):<class '__main__.test'>                           也相当于类对象的类型

返回值  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__   我想不通,有知道的希望告诉我一下


  • 1

Reply