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

时间:2018-11-17 18:17:14

标签: python

所以我已经将python用作功能语言已有一段时间了,但是我正在尝试做“正确的”事情,现在使用类...然后崩溃。我正在尝试编写一个可以实例化该类的多个成员的类方法(用例是从SQLAlchemy中加载行。)我只想能够调用该类方法并使其返回状态码(成功/失败)。而不是返回对象列表。然后访问对象,然后遍历该类。到目前为止,这是我的代码(当我使用类方法时,该代码无法迭代,而在使用常规构造函数时,该方法可以正常工作。)我在这里是否离谱/疯狂?这样做的“ pythonic”方法是什么?任何帮助表示赞赏,谢谢。

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)

2 个答案:

答案 0 :(得分:1)

用你自己的话说-是的,你是卑鄙的,疯狂的:)

状态代码是C语言的东西,不是具有适当异常语义的Python语言。修改全局状态无疑是灾难的秘诀。所以-不要这样做。返回对象列表。如果发生灾难性事件,则引发异常;如果碰巧没有对象,则仅返回一个空列表。这允许客户端代码执行

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

使用前无需费心检查。

答案 1 :(得分:0)

功能语言具有某些优势,在探索程序风格时,您走了另一条路。全局变量和类变量都有它们的位置,但是如果您需要触发两个 SQAlchemy查询并并行使用结果,将会发生什么?第二个查询将遍历第一个仍然需要的类属性。使用对象属性(实例属性)可以解决此问题,因为每个结果都包含自己的句柄。

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