hello? 发表于 2022-7-21 17:43:04

小白:property原理

首先说一下我目前知道的
大概property的用法
class C:
    def __init__(self,value=10):
      self.name=value
    def getter(self):
      return self.name
    def setter(self,value):
      self.name=value
    def deler(self):
      del self.name
    x=property(getter,setter,deler)

   
c=C()
c.x
10
del c.x
c.x
Traceback (most recent call last):
File "<pyshell#53>", line 1, in <module>
    c.x
File "<pyshell#49>", line 5, in getter
    return self.name
AttributeError: 'C' object has no attribute 'name'
c.x=12
c.x
12
c.name
12

我感觉和下面代码作用差不多(不知道对不对)
class C:
    def __init__(self,value=10):
      self.name_=value
    @property
    def name(self):
      return self.name_
    @name.setter
    def name(self,value):
      self.name_=value
    @property
    def deler(self):
      del self.name_

      
c=C()
c.name
10
c.name=12
c.name
12

用property应该还是会用一点点
不过原理不是很理解

问题一:(图片中)__get__方法的几个参数不理解,这里的__get__方法的instance指的是Test实例t(为什么是t呢),还有owner在这里的作用是什么呢?
__set__同问。
问题二:就简要分析一下property的原理(希望我能听懂{:10_266:} )主要是那个x(图片中),它怎么工作的,感觉它既像Test类里的属性,有像MyPorperty类里的实例对象
它是怎么绕一圈到调用Test里的方法的?
问题三:使用property的优点

小白求助,希望各位大佬帮忙解释一下{:10_266:} {:10_266:} {:10_266:}

Victor0321 发表于 2022-7-21 19:17:38

1

hello? 发表于 2022-7-21 19:21:55

Victor0321 发表于 2022-7-21 19:17
1

不要白嫖{:10_266:}

hrpzcf 发表于 2022-7-21 19:40:27

去看一下描述符类的原理就懂了

hello? 发表于 2022-7-21 20:56:04

hrpzcf 发表于 2022-7-21 19:40
去看一下描述符类的原理就懂了

我去康康

hello? 发表于 2022-7-21 21:21:50

hrpzcf 发表于 2022-7-21 19:40
去看一下描述符类的原理就懂了

一般什么时候可以用到property呢

hrpzcf 发表于 2022-7-21 21:45:54

hello? 发表于 2022-7-21 21:21
一般什么时候可以用到property呢

@property后的函数可以当属性用。

比如你想实现一个类属性只能读取值不能赋值,那使用@property xxx函数且不使用xxx.setter就可以,或者 xxx = property(getx)也可以。

又比如你想实现读取实例属性值或设置属性值时对数据做一下转换或者做别的事,那你就可以使用@property并在相应的xxx.getter xxx.setter xxx.deleter 修饰的函数里实现你的逻辑,这样一旦该@property属性被取值或者赋值、删除等,就会触发你的逻辑。

hornwong 发表于 2022-7-21 22:23:01

{:5_108:}
页: [1]
查看完整版本: 小白:property原理