如何在Python方法内创建可在程序全局使用的对象?
这个需求完全可以实现,你给出的原始代码无法运行主要存在3个问题:
- 不可以用Python关键字
def作为函数名,会触发语法错误 - 类
abc的实例方法random缺少必填的self参数,实例调用时会报错 - 你在函数内部创建的
ob是局部变量,仅在该函数作用域内有效,其他函数无法直接访问
实现方案
方案1:使用全局变量存储实例
这是最简单的实现方式,提前在全局作用域声明变量,在函数内部初始化时标记为全局变量即可,示例代码如下:
class Abc(): def random(self): print("abc") # 全局作用域提前声明实例变量 global_ob = None def init_ob(): # 标记此处使用的是全局变量,而非创建局部变量 global global_ob global_ob = Abc() def xyz(): global_ob.random() # 先执行初始化,再调用其他方法 init_ob() xyz() # 运行输出:abc
方案2:使用单例模式(更推荐)
如果不想污染全局命名空间,可以给类设置单例元类,保证该类无论在任意位置实例化,返回的都是同一个对象,无需手动维护全局变量:
# 单例元类实现 class SingletonMeta(type): _instances = {} def __call__(cls, *args, **kwargs): if cls not in cls._instances: cls._instances[cls] = super().__call__(*args, **kwargs) return cls._instances[cls] class Abc(metaclass=SingletonMeta): def random(self): print("abc") def init_ob(): # 此处创建实例 ob = Abc() def xyz(): # 其他位置实例化拿到的是同一个对象 ob = Abc() ob.random() init_ob() xyz() # 运行输出:abc
注意事项
- 全局变量方案需要严格保证初始化函数先于所有使用该实例的函数执行,否则会触发属性不存在的报错
- 单例模式无需关心初始化顺序,第一次实例化时会自动创建对象,后续调用都会复用该实例
内容的提问来源于stack exchange,提问作者Faris Kamal Kakkengal
相关产品推荐
相关产品推荐

