代码之家  ›  专栏  ›  技术社区  ›  thanasissdr

在条件下为类的所有实例设置属性

  •  0
  • thanasissdr  · 技术社区  · 7 年前

    filepath ),更改实例的值(即,在第一种情况下,更改 文件路径 对于 a 实例,但如果我创建一个新实例,例如。 b 文件路径 价值观。

    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
    

    有没有办法改进这个代码和/或有一个智能的设计模式?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Ondrej K.    7 年前

    请纠正我,如果我没有正确理解您要查找的内容,我可以相应地调整答案,但是从我得到的信息来看,您要查找的是类和实例属性以及它们之间的区别:

    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中,所有类都是新样式的,我认为这是继承自 object filepath . 严格来说,这是没有必要的,但如果这是接口的一部分。。。当然,您也可以直接在类定义中指定第一个初始默认值。

    '/path/to/original/file' 去吧。在这一点上,我们创建和实例 a 班级 当我们进入它的 文件路径 属性,我们得到class属性的值。然后我们为实例属性指定一个不同的值( a.filepath 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")
    

    "/path/to/another/file" b.filepath c.filepath 是“/第三个/文件”,可能是我们想要的,也可能不是 b、 文件路径 事实就是这样。

    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_filepath 属性化,用于分配给每个实例 self.filepath

    a.filepath
    b.filepath
    c.filepath
    

    现在的值为:

    /path/to/another/file
    /path/to/original/file
    /third/file
    
    推荐文章