【问题标题】:get all instances of a class in python在python中获取一个类的所有实例
【发布时间】:2017-11-22 16:36:48
【问题描述】:

这是我在文件files.py中的类:

class Files():

    def __init__(self, *, kwargs1=None, ......, kwargsx=None):
        self.kwargs1 = kwargs1
        ...................
        ...................
        ...................
        self.kwargsx = kwargsx

        __validate()
        if self.kwargs1 == "create":
            self.__create()
        if kwargsx == "remove":
            self.__remove()

    def __validate():
        validate attributes of object and raise execption if fails

    def __create(self):
        create file

    def __remove(self):
        remove file

在另一个文件tasks.py我有这个:

from files import File

File(kwargs1="create", kwargs2="path/to/destination1", kwargs3="/path/to/source1",..........)
File(kwargs1="create", kwargs2="path/to/destination2", kwargs3="/path/to/source2",..........)

目前的情况是每个对象都得到验证,然后继续使用__create()__remove()。我要问的是是否可以先验证所有对象然后继续。 我可以在tasks.py 中实现它。我必须将私有方法 __create()__remove() 声明为公共方法 create(self)remove(self),并且类看起来像这样:

class Files():

    def __init__(self, *, kwargs1=None, ......, kwargsx=None):
        self.kwargs1 = kwargs1
        ...................
        ...................
        ...................
        self.kwargsx = kwargsx

        __validate()

    def __validate():
        validate attributes of object and raise execption if fails

    def create(self):
        create file

    def remove(self):
        remove file

还有tasks.py

files = []
try:
    files.append(File(kwargs1="create", kwargs2="path/to/destination1", kwargs3="/path/to/source1",..........))
    files.append(File(kwargs1="create", kwargs2="path/to/destination2", kwargs3="/path/to/source2",..........))
except ValueError as e:
    print(e)
else:
    for item in files:
        if item.kwargsx == "create":
            create(item)
        elif item.kwargsx == "remove":
            remove(item)

我的问题是是否可以在类文件本身中实现这个逻辑?我能想到的唯一方法是检查堆栈并迭代每个对象初始化,但我不知道它是否可行!

【问题讨论】:

    标签: python-3.x class object instance


    【解决方案1】:

    这是一个通用方案——一个类不引用实例,

    class File:
        _instances = []
        def __init__(self, ..., action=None):
            ....
            self.action = action
            File._instances.append(self)
    
        @classmethod
        def resolve_actions(cls):
            for instance in cls._instances:
                if instance.action == "create":
                    instance.__create()
                elif instance.action == "remove":
                    instance.__remove()
    

    然后在代码中的某处

    File.resolve_actions()
    

    【讨论】:

    • 我已经实现了逐个验证对象的属性,例如,如果第一个实例一切正常,它就会被创建,第二个对象也是如此。我试图让所有对象一个一个地检查它们,然后才对每个对象执行操作,或者获取第一个对象,验证并存储它,获取第二个对象,验证并存储,如果全部通过,然后继续进行适当的每个对象的动作!这种情况可能吗?
    • @Max,我为您提供了一个通用方案。在一个循环中,您可以累积结果并在第二个循环中对其进行操作 - 或者您可以将其设置为另一个类属性并在每次创建实例时累积您的决定,然后在所有实例上再次执行一次。
    • 感谢您的回答,但我认为我没有明确指出我的问题,或者我只是不明白该怎么做。无论如何我都会编辑问题。
    猜你喜欢
    • 2012-04-26
    • 2021-08-23
    • 2013-10-31
    • 1970-01-01
    • 2023-03-28
    • 2020-01-26
    • 2022-07-14
    • 1970-01-01
    相关资源
    最近更新 更多