Python class 客观性惯例
Python class objectivity convention
这样创造类的风格好吗?我阅读了 PEP8 文档,但没有看到任何好的示例。如果不是,那怎么是正确的方法?感谢您的回答。
class Zone:
def __init__(self, index=None, name=None):
self._index = index
self._name = name
@property
def index(self):
return self._index
@property
def name(self):
return self._name
@index.setter
def index(self, index):
self._index = index
@name.setter
def name(self, name):
self._name = name
您的 setter 和 getter 什么都不做。通过您的实施,此 class 的用户会这样做:
z = Zone()
z.name = 'foo'
print(z.name)
与此实现比较:
class Zone:
def __init__(self, index=None, name=None):
self.index = index
self.name = name
z = Zone()
z.name = 'foo'
print(z.name)
它的工作原理完全相同,代码少得多。
除非你做你的二传手and/or吸气剂中的任何东西,否则你不需要它们。
如果您打算做的是封装您的数据并使用 setters 设置它并使用 getters 获取它,那么您所做的将无济于事。您将 _name 和 _index 声明为受保护的,这并不意味着它不能被外部函数访问,因此 class 之外的函数可以轻松访问和更改它们,使您的 getter 和 setter没用。
但是,您可以通过在前面使用一个额外的下划线来将它们声明为私有,这样您的 属性 class 将被删除,然后 setters class 会有用,不会再被外部函数访问了。
class Zone:
def __init__(self,index=None,name=None):
self.__index = index
self.__name = name
def index(self, index):
self.__index = index
def name(self, name):
self.__name = name
def get_name(self):
return self.__name
zone=Zone()
zone.name('ben')
print(zone.get_name())
>>>ben
print(zone.__name)
>>> AttributeError: 'Zone' object has no attribute '__name'
这样创造类的风格好吗?我阅读了 PEP8 文档,但没有看到任何好的示例。如果不是,那怎么是正确的方法?感谢您的回答。
class Zone:
def __init__(self, index=None, name=None):
self._index = index
self._name = name
@property
def index(self):
return self._index
@property
def name(self):
return self._name
@index.setter
def index(self, index):
self._index = index
@name.setter
def name(self, name):
self._name = name
您的 setter 和 getter 什么都不做。通过您的实施,此 class 的用户会这样做:
z = Zone()
z.name = 'foo'
print(z.name)
与此实现比较:
class Zone:
def __init__(self, index=None, name=None):
self.index = index
self.name = name
z = Zone()
z.name = 'foo'
print(z.name)
它的工作原理完全相同,代码少得多。
除非你做你的二传手and/or吸气剂中的任何东西,否则你不需要它们。
如果您打算做的是封装您的数据并使用 setters 设置它并使用 getters 获取它,那么您所做的将无济于事。您将 _name 和 _index 声明为受保护的,这并不意味着它不能被外部函数访问,因此 class 之外的函数可以轻松访问和更改它们,使您的 getter 和 setter没用。
但是,您可以通过在前面使用一个额外的下划线来将它们声明为私有,这样您的 属性 class 将被删除,然后 setters class 会有用,不会再被外部函数访问了。
class Zone:
def __init__(self,index=None,name=None):
self.__index = index
self.__name = name
def index(self, index):
self.__index = index
def name(self, name):
self.__name = name
def get_name(self):
return self.__name
zone=Zone()
zone.name('ben')
print(zone.get_name())
>>>ben
print(zone.__name)
>>> AttributeError: 'Zone' object has no attribute '__name'