gpt4 book ai didi

python - 防止改变实例变量

转载 作者:行者123 更新时间:2023-12-02 20:48:07 30 4
gpt4 key购买 nike

我想允许用户在实例化后更改 self.path 但不允许任何其他实例变量。但是,如果更改了 self.path,则应重新评估其他实例变量。这可能吗?

class File(object):

def __init__(self, path):
self.path = os.path.abspath(path)
self.name = os.path.basename(self.path)
self.parent = os.path.dirname(self.path)

self.extension = self._get_extension()
self.category = self.get_category(self.extension)
self.exists = os.path.isfile(self.path)

def _get_extension(self):
extension = None
result = os.path.splitext(self.name)[1][1:]
if result:
extension = result
return extension

def get_category(self, extension):
if extension:
file_extension = extension.upper()
for key in fileGroups.keys():
common = set(fileGroups[key]) & set([file_extension])
if common:
return key
return 'UNDEFINED'

最佳答案

来自 https://stackoverflow.com/a/598092/3110529您正在寻找的是属性 getter/setter 模式。 Python 通过 @property@member.setter 实现这一点,您可以在上面的答案示例中看到这一点。

就您的问题而言,您可以通过执行以下操作来解决它:

class File(object):

def __init__(self, path):
self.__path = os.path.abspath(path)
self.__name = os.path.basename(self.path)
self.__parent = os.path.dirname(self.path)

self.__extension = self._get_extension()
self.__category = self.get_category(self.extension)
self.__exists = os.path.isfile(self.path)

@property
def path(self):
return self.__path

@path.setter
def path(self, value):
self.__path = value
# Update other variables here too

@property
def name(self):
return self.__name

etc for the rest of your properties

这意味着您可以执行以下操作:

file = File("a path")
print(file.path)
file.path = "some other path"

# This will throw an AttributeError
file.name = "another name"

请注意,一切都是一样的,但如果尝试修改没有 setter 的属性,将会抛出错误。

这确实会使您的 File 类显着变大,但它会阻止用户更改 path 以外的成员,因为没有实现 setter。从技术上讲,用户仍然可以执行 file.__path = "something else" 但普遍认为以双下划线为前缀的成员是私有(private)的,不应被篡改。

关于python - 防止改变实例变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43408152/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com