Discuss / Python / 类对象与实例对象的区别,下面的例子哪位大神更清楚原理,帮忙解释下

类对象与实例对象的区别,下面的例子哪位大神更清楚原理,帮忙解释下

Topic source

三种修改属性值的方法比较, 类对象的属性值无法修改, 实例对象的属性值可以修改

class MyObject(object):
    def __init__(self):
        self.x = 9     #默认为9
    def power(self):
        return self.x * self.x
    def set_x(self, x):
        self.x = x

#类对象属性值无法修改
MyObjectMyObject().x    #结果不变,为9
MyObject().x = 2
MyObject().x    #结果不变,为9
setattr(MyObject(), 'x', 2)
MyObject().x    #结果不变,为9
MyObject().set_x(2)
MyObject().x    #结果不变,为9

#实例对象属性值可以修改
objobj = MyObject() #实例化
obj.x   #默认为9
obj.x = 2
obj.x   #结果变化为2
setattr(obj, 'x', 9)
obj.x   #结果变化为9
obj.set_x(2)
obj.x   #结果变化为2

之前记得廖老师讲过类是模板, 只有在实例化之后才可以固定引用, 通过重复运行发现每次运行类对象, 内存地址是变化的。但是实例化之后内存地址才会固定下来

#类对象的内存地址每次变化
MyObject()  #第一次运行,输出<__main__.MyObject at 0x10efefc3a48>
MyObject()  #第二次运行,输出<__main__.MyObject at 0x10efed0d108>
MyObject()  #第三次运行,输出<__main__.MyObject at 0x10efefc3908>

#实例对象的内存地址引用固定
obj  #第一次运行,输出<__main__.MyObject at 0x10efed09248>
obj  #第二次运行,输出<__main__.MyObject at 0x10efed09248>
obj  #第三次运行,输出<__main__.MyObject at 0x10efed09248>

廖雪峰

#2 Created at ... [Delete] [Delete and Lock User]

你的理解是错的。

MyObject()就是实例,只是没有变量引用它,你就无法对他进行后续操作

x=MyObject()就把实例引用给到变量x,用变量x可以操作实例,变量x的值就是实例地址

你别重新让x指向另一个实例,它的地址就永远不变

y=x相当于x和y都指向同一个实例,两个变量的值相同

MyObject是class,加个括号MyObject()表示创建并返回实例

感谢廖老师解答,这回明白了,在没有变量引用MyObject()的情况下,MyObject()只是存在临时地址上,所以后续的操作(赋值等)其实都没有用,不是对MyObject()的操作。相反,引用到变量后,变量x才可以影响实例。


  • 1

Reply