您的位置:首页 > 编程语言 > Python开发

Python 继承结构中全局变量的使用

2014-08-17 21:25 573 查看
考虑在Python中建立下面的继承结构,在父类中由一个静态成员__repo__,在两个子类中分别修改父类中这个静态成员,结果两个子类之间的修改会相互影响

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.在继承结构中,父类需要慎用全局变量,当一个子类对象操作该全局变量,其他子类对象均会受影响
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: