1

I'm new to Python, coming from C#. I know how to publicize class attributes and methods. I'd like to publicize my instance variables. Having intellisense detect them would be ideal. Also, please let me know if this is not pythonic or if I should be doing something else.

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
4

2 回答 2

3

您不需要这样做。Python 社区使用一个约定,任何名称的类成员都具有:

  • 前导下划线 - 被认为是私有的/受保护的,
  • 双前导下划线被认为是类私有 - 通过使用名称修饰来模拟私有访问。成员在类外无法通过其名称访问,因为它以类名为前缀(但如果您直接调用它仍然可以访问)
  • 双前导下划线和双尾下划线 - 覆盖某些行为,最接近的 C# 类似物将是内置接口实现和Object方法覆盖。文档中的更多信息。
  • 其他一切都被认为是公开的。

如果您真的想在访问成员时进行一些计算,您可以执行属性,但这不被视为/强制执行为最佳实践。

于 2013-10-07T16:11:25.743 回答
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)
于 2013-10-07T16:15:58.883 回答