Python 获取类属性

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python 获取类属性相关的知识,希望对你有一定的参考价值。

参考技术A 通常情况下,我们在类对象中定义的属性都会设置访问权限,外部程序无法直接获取,防止恶意的修改,当属性被设置为私有属性后,外部程序该如何访问呢?

例:使用普通方法访问私有属性

例:使用property方法访问私有属性

property()方法接收两个参数,第一个参数为获取属性需要调用的实例方法名,第二个参数为设置属性需要调用的实例方法名,返回值就设置为需要设置、获取的属性名。

当执行到实例.属性时,就会调用获取实例属性的方法,当执行到实例.属性 = xxx时,就会调用设置实例属性的方法。

例:使用@property/@xxx.setter装饰器访问私有属性

Python忽略属性设置器而支持属性获取器

【中文标题】Python忽略属性设置器而支持属性获取器【英文标题】:Python ignoring property setter in favor of property getter 【发布时间】:2016-10-10 19:57:06 【问题描述】:

我创建了一个类,该类具有带 setter 的属性。有 2 种不同的方式来使用这个类,因此某些对象组件的值可能会根据场景以不同的顺序设置(即我不想在__init__ 期间设置它们)。我在这里包含了一个具有自己的 set 函数的非属性,以说明什么是有效的,什么是无效的。

class Dumbclass(object):

  def __init__(self):
    self.name = None
    self.__priority = None

  @property
  def priority(self):
    return self.__priority

  @priority.setter
  def priority(self, p):
    self.__priority = p

  def set_name(self, name):
    self.name = "dumb " + name

  def all_the_things(self, name, priority=100):
    self.set_name(name) 
    self.priority(priority)

    print self.name
    print self.priority

当我运行以下命令时,它返回TypeError: 'NoneType' object is not callable。我用 pdb 进行了调查,发现它在 self.priority(priority) 调用 getter 而不是 setter。

if __name__ == '__main__':
  d1 = Dumbclass()
  d1.all_the_things("class 1")

  d2 = Dumbclass()
  d2.all_the_things("class 2", 4)

这是怎么回事?

【问题讨论】:

确认它也发生在 python3 中。很好奇答案是什么。 @Travis,当赋值操作发生并且OP没有做任何赋值操作时调用setter ...如果您最终调用该属性,为什么还要使用property?用普通的方法就好了。 【参考方案1】:

简答:请将您的线路 self.priority(priority) 更改为 self.priority = priority

解释:只有当你给属性赋值时才会调用Setter。在您的代码中,您没有进行赋值操作。

如果您想了解更多,这里有一些不错的参考资料:

    Python descriptors How does the @property decorator work? Real Life Example

【讨论】:

您能否提供一个很好的例子来说明为什么要费心制作一个单独的二传手?【参考方案2】:

由于尝试将优先级视为 all_the_things 方法中的一种方法,您正面临此问题。此时它已经是一个属性,所以你像变量一样赋值给它:

def all_the_things(self, name, priority=100):
    self.set_name(name)
    self.priority = priority

【讨论】:

那么如何实际使用setter方法呢?或者更确切地说,什么时候?

以上是关于Python 获取类属性的主要内容,如果未能解决你的问题,请参考以下文章

Python类与对象属性

无法使用 SWIG 在 Python 中实例化 C++ 类(获取属性错误)

在python中获取类和实例的属性

Python获取当前类的所有成员属性

python string字符串转类属性

新手入门学Python基础—多态类属性和类方法