我的问题是,在实例化一个类时,在Python中分配和实例化的顺序是什么?作者的以下代码假定在创建类的实例(例如调用__init__())时'DefaultDomainName'将存在,但这似乎并不是在我的测试中在OS X上的Python 2.5中的情况。
在Manager __init__()方法中,我的打印语句显示为“None”。在全局函数set_domain()中的打印语句在设置Manager.DefaultDomainName之前显示“None”,并在赋值后显示预期值“test_domain”。但是,在调用set_domain()后再次创建Manager实例时,__init__()方法仍然显示为“None”。
有谁能帮助我并解释这里发生了什么。非常感谢。谢谢。
# 版权所有 (c) 2006,2007,2008 Mitch Garnaat http://garnaat.org/ # # 特此授权,任何获得本软件及相关文档文件(以下简称“软件”)的人, # 可以自由地处理本软件,包括但不限于使用、复制、修改、合并、发布、分发、 # 授权和/或销售软件的副本,并允许获得软件的人这样做,前提是: # # # 上述版权声明和本许可声明应包含在所有副本或重要部分中。 # # 本软件按“原样”提供,不附带任何明示或暗示的保证, # 包括但不限于适销性、特定用途的适用性和非侵权性。在任何情况下, # 作者均不对任何索赔、损害或其他责任承担责任, # 不论是在合同、侵权行为或其他方面引起的, # 与本软件或使用或其他交易有关的。
import boto from boto.utils import find_class
class Manager(object):
DefaultDomainName = boto.config.get('Persist', 'default_domain', None)
def __init__(self, domain_name=None, aws_access_key_id=None, aws_secret_access_key=None, debug=0): self.domain_name = domain_name self.aws_access_key_id = aws_access_key_id self.aws_secret_access_key = aws_secret_access_key self.domain = None self.sdb = None self.s3 = None if not self.domain_name: print "1: %s" % self.DefaultDomainName print "2: %s" % Manager.DefaultDomainName self.domain_name = self.DefaultDomainName #self.domain_name = 'test_domain' if self.domain_name: boto.log.info('未设置SimpleDB域名,使用默认域名: %s' % self.domain_name) else: boto.log.warning('未设置SimpleDB域名,禁用持久性') if self.domain_name: self.sdb = boto.connect_sdb(aws_access_key_id=self.aws_access_key_id, aws_secret_access_key=self.aws_secret_access_key, debug=debug) self.domain = self.sdb.lookup(self.domain_name) if not self.domain: self.domain = self.sdb.create_domain(self.domain_name)
def get_s3_connection(self): if not self.s3: self.s3 = boto.connect_s3(self.aws_access_key_id, self.aws_secret_access_key) return self.s3
def get_manager(domain_name=None, aws_access_key_id=None, aws_secret_access_key=None, debug=0): return Manager(domain_name, aws_access_key_id, aws_secret_access_key, debug=debug)
def set_domain(domain_name): print "3: %s" % Manager.DefaultDomainName Manager.DefaultDomainName = domain_name print "4: %s" % Manager.DefaultDomainName def get_domain(): return Manager.DefaultDomainName def revive_object_from_id(id, manager): if not manager.domain: return None attrs = manager.domain.get_attributes(id, ['__module__', '__type__', '__lineage__']) try: cls = find_class(attrs['__module__'], attrs['__type__']) return cls(id, manager=manager) except ImportError: return None def object_lister(cls, query_lister, manager): for item in query_lister: if cls: yield cls(item.name) else: o = revive_object_from_id(item.name, manager) if o: yield o