所以我已经将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)
答案 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循环中都一直在使用它们。