Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 不带getter的只读属性_Python_Oop - Fatal编程技术网

Python 不带getter的只读属性

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

我在读关于在Python中使用getter的文章,引用:

python的方法是不使用它们。如果你一定要把它们藏起来 他们躲在一处地产后面

同一个页面包含了各种示例,但我的问题是,如果getter不是Python的方式,那么我如何向阅读我的代码的人指出变量在构造之后应该是只读的

假设我有以下课程:

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
。旧样式的类已删除。我将编辑我的答案以避免混淆。