Discuss / Python / 有个问题请教一下

有个问题请教一下

Topic source
class MyObject(object):
    def __init__(self):
        self.x = 9
    def power(self):
        return self.x * self.x


fn = hasattr(MyObject(), 'power')
fn1 = getattr(MyObject(), 'power')
print(fn)
MyObject.x = 2
print('MyObject.x=', MyObject.x)
print('fn1()=', fn1())

obj = MyObject()
fn2 = getattr(obj, 'power')
obj.x = 2
print('fn2()=', fn2())


True
MyObject.x= 2
fn1()= 81
fn2()= 4

为什么fn1还是按默认值x=9来算,fn2就按后面的x=2来算

看了下一章的讲解,self.x是实例变量,没有实例化前是不能访问,那为什么MyObject.power能再没有实例的情况下运行?

一库大神

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

已经实例化了对象

路遥无马

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

前者是你创建了一个MyObject.x的变量,后者是实例属性屏蔽类属性

路遥无马

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

说错了前者是添加了实例属性,后者是实例属性屏蔽类属性

救赎_TGA

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

         我是一个小白,我看了一下,可不可以理解成,前者未实例化一个类,MyObject.x = 2 只是给MyObject类绑定了一个类属性 如:(def MyObject():  x = 2   def __init__(self)  ......),而后者是实例化了一个类,obj.x = 2属于修改了实例类的类属性,大神们帮我指点一下,看看正确吗,如不正确,指导一下正确解释,谢谢啦

520bv

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

fn1()=81是因为调用了类属性进行power(),而类属性是MyObject().x=9;fn2()=4,是因为调用了实例属性obj.x=2,执行power()自然是4;而MyObject.x与类MyObject(object)没关系,仅仅是个变量而已。不信的话你随意改动MyObject.x的值,print(MyObject().x)结果都不会等于MyObject.x的值,说到底是楼主定义代码时搞错了,有()解释器才会认为是你前面定义的类这一新数据类型,不然它就只是个变量(而这个变量的类型在未初始化时是任意的/未知的)

或者如果你是用Pycharm写代码的话,在Console输入以下代码

>>>class MyObject(object):
···    def __init__(self):
···        self.here = '有此属性'

显然

>>>MyObject.here
Traceback (most recent call last):
  File "<input>", line 1, in <module>
AttributeError: type object 'MyObject' has no attribute 'here'

而这样才是正确的

>>>MyObject().here
'有此属性'

希望以后我们大家在写代码能注意这个小问题,别最后找不出是哪里出了bug(lll¬ω¬)


  • 1

Reply