Python 继承结构中全局变量的使用
2014-08-17 21:25
573 查看
考虑在Python中建立下面的继承结构,在父类中由一个静态成员__repo__,在两个子类中分别修改父类中这个静态成员,结果两个子类之间的修改会相互影响
运行结果是
('A', 1)
('B', 2)
说明就算是类处于继承结构中时,类的全局变量不经会被自己的对象共享,如果类作为父类,也是会被子类对象中父类中的“副本”所共享
运行结果
('A', 1)
('B', 2)
('GenericRepo', 0)
如上所示,对于父类的静态变量,父类对象,以及子类对象分别对其进行操作之后,都会影响到类的所有对象,包含子类中的父类“副本”
正确的做法,应是将父类的静态变量修改为成员变量,如下
运行结果
('A', 1)
---
('B', 2)
---
('GenericRepo', 0)
---
总结:
1.在继承结构中,父类需要慎用全局变量,当一个子类对象操作该全局变量,其他子类对象均会受影响
class GenericRepo(object): __repo__ = {} def fun(self): print self.i def get(self): for key in GenericRepo.__repo__.keys(): print (key, GenericRepo.__repo__[key]) class A(GenericRepo): def __new__(cls): if not hasattr(A, "__inst__"): cls.__inst__ = super(GenericRepo, cls).__new__(cls) return cls.__inst__ def fun(self): GenericRepo.__repo__["A"] = 1 class B(GenericRepo): def __new__(cls): if not hasattr(B, "__inst__"): cls.__inst__ = super(GenericRepo, cls).__new__(cls) return cls.__inst__ def fun(self): GenericRepo.__repo__["B"] = 2
if __name__ == '__main__': a = A() b = B() a.fun() b.fun() a.get()
运行结果是
('A', 1)
('B', 2)
说明就算是类处于继承结构中时,类的全局变量不经会被自己的对象共享,如果类作为父类,也是会被子类对象中父类中的“副本”所共享
class GenericRepo(object): __repo__ = {} def fun(self): GenericRepo.__repo__["GenericRepo"] = 0 def get(self): for key in GenericRepo.__repo__.keys(): print (key, GenericRepo.__repo__[key]) class A(GenericRepo): def __new__(cls): if not hasattr(A, "__inst__"): cls.__inst__ = super(GenericRepo, cls).__new__(cls) return cls.__inst__ def fun(self): GenericRepo.__repo__["A"] = 1 class B(GenericRepo): def __new__(cls): if not hasattr(B, "__inst__"): cls.__inst__ = super(GenericRepo, cls).__new__(cls) return cls.__inst__ def fun(self): GenericRepo.__repo__["B"] = 2 if __name__ == '__main__': a = A() b = B() g = GenericRepo() a.fun() b.fun() g.fun() a.get()
运行结果
('A', 1)
('B', 2)
('GenericRepo', 0)
如上所示,对于父类的静态变量,父类对象,以及子类对象分别对其进行操作之后,都会影响到类的所有对象,包含子类中的父类“副本”
正确的做法,应是将父类的静态变量修改为成员变量,如下
class GenericRepo(object): def __init__(self): self.__repo__ = {} def fun(self): self.__repo__["GenericRepo"] = 0 def get(self): for key in self.__repo__.keys(): print (key, self.__repo__[key]) class A(GenericRepo): def __new__(cls): if not hasattr(A, "__inst__"): cls.__inst__ = super(GenericRepo, cls).__new__(cls) return cls.__inst__ def fun(self): self.__repo__["A"] = 1 class B(GenericRepo): def __new__(cls): if not hasattr(B, "__inst__"): cls.__inst__ = super(GenericRepo, cls).__new__(cls) return cls.__inst__ def fun(self): self.__repo__["B"] = 2 if __name__ == '__main__': a = A() b = B() g = GenericRepo() a.fun() b.fun() g.fun() a.get() print "---" b.get() print "---" g.get() print "---"
运行结果
('A', 1)
---
('B', 2)
---
('GenericRepo', 0)
---
总结:
1.在继承结构中,父类需要慎用全局变量,当一个子类对象操作该全局变量,其他子类对象均会受影响
相关文章推荐
- python多文件使用同一个全局变量的定义和使用方法
- Python 中全局变量的使用说明
- Python基础学习篇——Global全局变量的使用
- python 的全局变量global变量使用
- Python 全局变量的使用
- python函数中使用全局变量
- [Python]全局变量的语法及使用
- python全局变量的使用
- python unittest TestCase间共享数据(全局变量的使用)
- 10 Python 函数内使用全局变量注意项
- python 在函数中使用全局变量的注意事项
- python中全局变量的使用
- 在python中实现生产者和消费者的例子(五):使用threading模块和全局变量
- python 使用全局变量 global
- python全局变量使用注意事项_
- python中必须使用global声明全局变量的情况
- python中全局变量的使用
- 在python中实现生产者和消费者的例子(四):使用thread模块和全局变量
- python全局变量的使用错误
- 关于Python中全局变量的使用的调试