Python 不带getter的只读属性
我在读关于在Python中使用getter的文章,引用: python的方法是不使用它们。如果你一定要把它们藏起来 他们躲在一处地产后面 同一个页面包含了各种示例,但我的问题是,如果getter不是Python的方式,那么我如何向阅读我的代码的人指出变量在构造之后应该是只读的 假设我有以下课程:Python 不带getter的只读属性,python,oop,Python,Oop,我在读关于在Python中使用getter的文章,引用: python的方法是不使用它们。如果你一定要把它们藏起来 他们躲在一处地产后面 同一个页面包含了各种示例,但我的问题是,如果getter不是Python的方式,那么我如何向阅读我的代码的人指出变量在构造之后应该是只读的 假设我有以下课程: class Car: def __init__(self, ID, name, tire, engine): self.ID = ID self.name = n
class Car:
def __init__(self, ID, name, tire, engine):
self.ID = ID
self.name = name
self.tire = tire
self.engine = engine
def __str__(self):
return "ID: {0} Name:{1} Tire: {2} Engine: {3}".format(self.ID, self.name, self.tire, self.engine)
如果我想向另一个开发人员指出,self.engine
在constructor
中设置后是只读的,我该怎么做?换句话说,如果客户端违反规则并试图设置它,那么如果self.engine
的实现发生更改(例如,从类engine
的对象更改为字典
),就会出现问题.您可以使用decorator,而不定义setter来传达不应修改引擎的信息:
class Car(object):
def __init__(self, ID, name, tire, engine):
self.ID = ID
self.name = name
self.tire = tire
self._engine = engine
def __str__(self):
return "ID: {0} Name:{1} Tire: {2} Engine: {3}".format(self.ID, self.name, self.tire, self.engine)
@property
def engine(self):
return self._engine
请注意,用户仍然可以绕过属性并直接设置\u引擎
请注意,@property
装饰器仅适用于新样式类。您可以使用装饰器而不定义setter来传达不应修改引擎的信息:
class Car(object):
def __init__(self, ID, name, tire, engine):
self.ID = ID
self.name = name
self.tire = tire
self._engine = engine
def __str__(self):
return "ID: {0} Name:{1} Tire: {2} Engine: {3}".format(self.ID, self.name, self.tire, self.engine)
@property
def engine(self):
return self._engine
请注意,用户仍然可以绕过属性并直接设置\u引擎
请注意,@property
装饰器仅适用于新样式类。为其指定一个下划线前缀,例如self.\u engine
。它不会阻止其他人使用它,但它清楚地表明了它的隐私。您还可以使用双下划线前缀使python破坏名称(有关详细信息,请参阅)。@PaulRooney不,下划线表示根本不应从类外部访问变量(派生类除外)。我不介意他们是否得到它,只是不允许他们在之后设置它(我知道没有什么能真正阻止他们这么做)。@MichaelButscher我不清楚你的分歧在哪里。@S.R.是的。如果你不想使用属性,你可以在类的文档字符串中列出可访问的变量,并提及类似“(读写)”或“(只读)的内容对于每个。给它一个下划线前缀,例如self.\u engine
。它不会阻止其他人使用它,但它是一个明确的私有指示符。您还可以使用双下划线前缀让python破坏名称(详见。@PaulRooney否,下划线表示根本不应从类外访问变量(派生类除外)。我不介意他们是否得到它,只是不允许他们事后设置它(我知道没有任何东西真正阻止他们这么做).@MichaelButscher我不清楚您的分歧在哪里。@S.R.是的。如果您不想使用属性,可以在类的文档字符串中列出可访问的变量,并提及类似“(读写)”或“(只读)的内容对于每一个类,@property
关键字将与类一起工作,即使它们不继承对象,至少在Python 3中是这样。正如我在问题中所说的,链接@property
显然不是Python的方式。@S.R.不,你不理解这个链接。属性是Python的方式。@S.R.我想答案是你的ked指的是定义方法,如get\u thing
和set\u thing
,而不是使用@property
。此工具的文档基本上描述了此用例:“典型用途是定义托管属性x”。请参阅只读属性voltage
@Galen的具体示例-我认为您是对的,我一直按照您和文档所描述的方式使用property
,但是看到另一个链接让我怀疑我是否做了正确的事情。@S.R.在Python 3中,所有类都是新样式的类,并且恰好继承自object
。旧样式的类已被删除。我将编辑我的答案以避免混淆。@正确地
关键字将与类一起工作,即使它们不继承对象,至少在Python 3中是这样。正如我在问题和链接中所述,@属性
显然不是Python的方式。@S.R.不,你不理解这个链接。属性是python的方式。@S.R.我认为你链接的答案是指定义方法,如get\u thing
和set\u thing
,而不是使用@property
。这个工具的文档基本上描述了这个用例:“一个典型的用法是定义一个托管属性x”。请参阅只读属性voltage
@Galen的具体示例-我认为您是对的,我一直按照您和文档所描述的方式使用property
,但是看到另一个链接让我怀疑我是否做了正确的事情。@S.R.在Python 3中,所有类都是新样式的类,并且恰好继承自object
。旧样式的类已删除。我将编辑我的答案以避免混淆。