python有趣的类属性

对python的类属性操作时,一些有趣的现象

这段时间在写tornado代码的时候,一开始我把处理请求的handler类中写入了几个属性,如下:

class Handler(tornado.web.RequestHandler):
    a=0.0
    b=0.0

在这种情况下,在Handler类中的处理get请求的方法中修改了a,b的值并且返还给用户。这样当下一次用户再刷新页面的时候,a和b会重新被置为0。程序不会出现问题,但是当我把程序加入以下内容时:

class Handler(tornado.web.RequestHandler):
    a=0.0
    b=0.0
    c=[1,2,3,4]

 在Handler类中的处理get请求的方法中修改了c的值之后,用户刷新页面后,c并没有被重置为[1,2,3,4],这样就造成了错误,那么为什么会出现这种现象呢?

原来,在python中,当程序一开始运行,这个类的属性就被生成,并占用内存的一块空间。小的数字和字符串是属于不可变类型,而列表是可变类型对象。当你实例化一个类对象并且尝试修改类属性中的小数字或者字符串时,由于这个类属性指向的内存中的值是不可变的,所以程序内部会给你生成一个实例对象的实例属性。

而尝试修改类属性中列表的值的时候,由于列表可变,所以类属性指向的内存空间不变,只是内存里的值改变了。这样就可以直接修改类属性的表现值。这样就出现了用户刷新页面时,c已经被修改了。

那么,如何避免这种错误呢?只需要把这些类属性,写成实例属性就好,这样也更加省内存:

class Handler(tornado.web.RequestHandler):
    def __init__(self):
        super().__init__()
        self.a=[1,2,3,4]

这里,由于执行了父类的初始化方法,那么真实情况呢,应该也要给init函数传入父类init函数所需要的参数的:

class Handler(tornado.web.RequestHandler):
    def __init__(self, application, request, **kwargs):
        super().__init__(application, request, **kwargs)
        self.a=[1,2,3,4]


        留下评论吧,AnonymousUser

              没有登录的话是不能使用评论功能的哈。 去登录 去注册


评论列表
暂无评论