Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/365.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 如何防止直接设置实例属性?_Python_Python 3.x_Oop_Access Modifiers - Fatal编程技术网

Python 如何防止直接设置实例属性?

Python 如何防止直接设置实例属性?,python,python-3.x,oop,access-modifiers,Python,Python 3.x,Oop,Access Modifiers,假设我有一个甲级 class A: __slots__ = ['_x'] def __init__(self): self._x = 10 @property def x(self): return self._x 我想限制从除其他实例的方法之外的任何地方分配给a.x 我该怎么做?这在Python中可能吗 < >是编写一个属性只有在特定方法中才可变的类,而不是直接从外部来。 < Python没有真正的“私有”变量,如

假设我有一个甲级

class A:
    __slots__ = ['_x']

    def __init__(self):
         self._x = 10
    
    @property
    def x(self):
        return self._x
我想限制从除其他实例的方法之外的任何地方分配给
a.x

我该怎么做?这在Python中可能吗


< >是编写一个属性只有在特定方法中才可变的类,而不是直接从外部来。

< Python没有真正的“私有”变量,如C++。即使通过使用前缀from将变量设置为private(如您所做的)。您始终可以使用

A.\u x
访问变量

如果出于某种原因想要模拟私有变量,可以使用
\uuu
(双下划线)前缀,因为它会损坏名称。类似地,您可以使用
@property
decorator生成getter和setter函数,并阻止对属性的访问。但是,即使这些也会失败,因为您可以使用
\uuuu dict\uuuu
直接访问变量

所以蟒蛇式的方法就是保持原样。Python在这方面与perl类似。要解释Perl书中关于隐私的一句名言

哲学是你不应该呆在客厅里,因为 你没有被邀请,不是因为有人用猎枪保护你


我完全同意@kinshukdua的观点。不过,我只是想探索更多可供您选择的选项。您可以通过设置一些条件来覆盖设置属性

这可能不是最具python风格的方式,但我愿意用一种更干净的方式来实现这一点

class A:
    _x = 10 #dont think you need an init method since you are not adding any data
    def __setattr__(self, key, value):
        if 'yes' in value[1]:
            super().__setattr__(key,value[0])
        else:
            raise TypeError('You should not have access to this')

    def change(self, value,loc= 'yes'):
        self._x = value,loc
        return self._x
        
    
    

这回答了你的问题吗?嗯,我对Python并不完全陌生,并且熟悉这种哲学。然而,在这个特殊的案例中,我正在寻找一种解决方法。这是你想做的事,只是因为。作为练习:)但我想如果可能的话,它已经实施了。谢谢你阻止我浪费时间:)我真的想到了元编程来解决这个问题。类似于创建一个元类,该元类为其创建锁对象和上下文管理器,并将其附加到类实例,然后重写setattr magic方法,这样,只有在打开锁的情况下才能添加和分配属性。在“new”调用期间执行所有这些操作,然后在init或其他方法调用期间使用锁分配其他属性。