是否可以通过一个classmethod调用实例化一个类的多个实例?

2024-10-04 09:26:24 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我用python作为函数语言已经有一段时间了,但我现在正在尝试做“正确的”事情并使用类。。。摔倒了。我正在尝试编写一个classmethod,它可以实例化类的多个成员(用例是从SQLAlchemy加载行)。我只希望能够调用classmethod并让它返回一个状态码(成功/失败),而不是返回一个对象列表。然后,为了访问对象,我将遍历类。到目前为止,我的代码是这样的(当我使用classmethod时,它无法迭代,当我使用普通构造函数时,它工作得很好。)我是不是太离谱了?“Python式”的方法是什么?感谢您的帮助。你知道吗

class KeepRefs(object):
    __refs__ = defaultdict(list)
    def __init__(self):
        self.__refs__[self.__class__].append(weakref.ref(self))

    @classmethod
    def get_instances(cls):
        for inst_ref in cls.__refs__[cls]:
            inst = inst_ref()
            if inst is not None:
                yield inst

class Credentials(KeepRefs):

    def __init__(self,name, username, password):
        super(Credentials, self).__init__()
        self.name=name
        self.username=username
        self.password=password

    @classmethod
    def loadcreds(cls):
        Credentials('customer1','bob','password')
        return True


success = Credentials.loadcreds()
for i in Credentials.get_instances():
    print (i.name)

Tags: 对象nameselfrefinitdefusernamepassword
2条回答

函数式语言有一定的优势,在探索过程式风格的过程中,您走得太远了。全局变量和类变量有各自的位置,但是如果您需要启动两个SQAlchemy查询并并行使用结果,会发生什么呢?第二个查询将遍历第一个查询仍然需要的类属性。使用对象属性(实例属性)可以解决问题,因为每个结果都包含自己的句柄。你知道吗

如果您关心的是避免预取结果数组,那么您是幸运的,因为Python提供了完美的解决方案:Generators,它基本上是懒惰函数。它们在Python中集成得非常好,我敢打赌您不知道在编写的每个for循环中都使用了它们。你知道吗

用你自己的话说-是的,你疯了:)

状态代码是C语言的一部分,而不是像Python那样具有适当异常语义的语言。修改全局状态肯定会导致灾难。所以-别这么做。返回对象列表。如果发生了灾难性的事情,抛出一个异常;如果恰好没有对象,则返回一个空列表。这允许客户机代码

for item in Thingies.load_thingies():
     ... # this won't do anything if load_thingies gave us an empty list

不用在使用前仔细检查。你知道吗

相关问题 更多 >