Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.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_Design Patterns - Fatal编程技术网

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