Python 在条件下为类的所有实例设置属性
首先,如果这是一个相当简单的问题,请原谅我的无知。我想要实现的是为类的每个实例(即Python 在条件下为类的所有实例设置属性,python,python-3.x,design-patterns,Python,Python 3.x,Design Patterns,首先,如果这是一个相当简单的问题,请原谅我的无知。我想要实现的是为类的每个实例(即filepath)创建一个属性,并为实例更改它(即,在第一种情况下,我为a实例更改filepath的值,但如果我创建了一个新实例,例如b,我希望保留原始的filepath值 filepath = '/path/to/original/file' class A(object): @classmethod def _set_path(cls, filepath): cls.fil
filepath
)创建一个属性,并为实例更改它(即,在第一种情况下,我为a
实例更改filepath
的值,但如果我创建了一个新实例,例如b
,我希望保留原始的filepath
值
filepath = '/path/to/original/file'
class A(object):
@classmethod
def _set_path(cls, filepath):
cls.filepath = filepath
return cls.filepath
def __init__(self, name):
self.name = name
A._set_path(filepath) # Set filepath for all instances: /path/to/original/file
a = A("Alice")
print(a.filepath)
a._set_path("/path/to/another/file") # Set filepath for instance a, but also for every new instance. This is what needs to be corrected.
print(a.filepath)
b = A("Bob")
print(b.filepath) # I would like to keep /path/to/original/file
有没有办法改进此代码和/或为这种情况提供智能设计模式?请纠正我,如果我没有正确理解您要查找的内容,我可以相应地调整答案,但根据我得到的信息,您正在查找类和实例属性以及它们之间的区别:
class A:
filepath = None
def __init__(self, name):
self.name = name
A.filepath = "/path/to/original/file"
a = A("Alice")
print(a.filepath)
a.filepath = "/path/to/another/file"
print(a.filepath)
b = A("Bob")
print(b.filepath)
定义类A
(注意:在Python3中,所有类都是新样式的,我认为继承对象是为了保持Python2的习惯)我们定义了一个class属性filepath
。严格来说,这不是必需的,但是如果这是接口的一部分……当然,您也可以直接在类定义中指定第一个初始默认值
然后我们将第一个值'/path/to/original/file'
分配给它。此时,我们创建并实例a类的a
,当我们访问它的filepath
属性时,我们得到class属性的值。然后我们将不同的值分配给实例属性(a.filepath
)再次访问它,我们会得到它的值,而我们没有修改class属性A.filepath
,这也是我们在新创建的实例b
中看到的
尽管如此,混合赋值给类和实例属性(同名)可能会引起混淆和可能无意的行为。
A.filepath = "/path/to/original/file"
a = A("Alice")
a.filepath = "/path/to/another/file"
b = A("Bob") # b.filepath is "/path/to/original/file"
A.filepath = "/third/file"
c = A("Carl")
现在访问a.filepath
会产生“/path/to/other/file”
,但是对于b.filepath
和c.filepath
都是“/third/file”,这可能是我们想要的,也可能不是
因此,对于类似的用例,我更喜欢如下内容:
class A:
default_filepath = "/path/to/original/file"
def __init__(self, name):
self.filepath = self.default_filepath
self.name = name
a = A("Alice")
a.filepath = "/path/to/another/file"
b = A("Bob")
A.default_filepath = "/third/file"
c = A("Carl")
类具有一个default\u filepath
属性,该属性用于分配给每个实例self.filepath
属性。这应有助于减少出错的风险。在上面的示例中:
a.filepath
b.filepath
c.filepath
现在具有以下值:
/path/to/another/file
/path/to/original/file
/third/file