公开实例属性的最佳方式

时间:2013-10-07 16:01:29

标签: python class attributes

我是Python新手,来自C#。我知道如何公开类属性和方法。我想宣传我的实例变量。智能感知检测它们将是理想的。另外,如果这不是pythonic或者我应该做其他事情,请告诉我。

class MyClass(Object):
    class_attribute = "Foo"

    #This is the way I'm currently publicizing instance attributes.  
    #Basically I'm using properties instead of instance attributes.
    @property
    def instance_property(self):
        return self._instance_property

    @instance_property.setter
    def instance_property_set(self, value):
        self._instance_property = value

2 个答案:

答案 0 :(得分:3)

您无需这样做。 Python社区使用名称具有的任何类成员的a convention

  • 领先的下划线 - 被视为私人/受保护,
  • 双重前导下划线认为类私有 - 通过使用名称修改来模仿私有访问。会员不能通过课堂外的名称访问,因为它的前缀是类名(但如果你直接调用它仍然可以访问)
  • 双前导下划线和双尾下划线 - 覆盖一些行为,最接近的C#analogue将是内置接口实现和Object方法的覆盖。 More info in the docs.
  • 其他一切都被认为是公开的。

如果你真的想在接受一个成员时做一些计算,你可以做属性,但它不被视为/强制执行最佳做法。

答案 1 :(得分:1)

class MyClass(Object):
    class_attribute = "Foo"

    def __init__(self,*args,**kwargs):
        self.instance_property = "whatever"

通常它(设置所需的值)在init函数中完成...或通过文档完成,或者将其设置为无效的默认值,稍后您检查并通知消费者他们必须在调用Calculate()之前设置变量X或无论如何...... getter和setter并不是要告知消费者他们应该设置哪些变量

没有理由使用getter / setter,除非你真的需要做一些工作(不只是把它传递给另一个变量)

setter的用例是

class GPIO(object):
    @property
    def value(self):
        return open("/sys/class/gpio/gpio141/value").read()

    @value.setter
    def set_value(self,val):
         open("/sys/class/gpio/gpio141/value","w").write(val)