u010249310
y2d1sm
采纳率100%
2020-12-28 23:12

python关于类的两个问题,看代码

class A:
    a=1    
    def pl(self):
        self.a*=2
        print(self.a)
q=A
q.a=2
w=A
print(w.a)
w().pl()
print(w.a)

执行结果为

2
4
2

问题1:为什么 w().pl()中w后面不跟()就会报错:TypeError: pl() missing 1 required positional argument: 'self'

问题2:最后一个print 的结果为啥不是4呢?

  1. 新手无金币,见谅~
  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

5条回答

  • leop7 leop7 4月前

    问题1:为什么 w().pl()中w后面不跟()就会报错:TypeError: pl() missing 1 required positional argument: 'self'

    因为你必须实例化才能调用其内部函数

    问题2:最后一个print 的结果为啥不是4呢?

    还是一样道理,因为你没有具体实例化对象,所以还是没运行函数,你可以改成以下情况对比下就知道了

    class A:
        a=1    
        def pl(self):
            self.a*=2
            print(self.a)
    q=A
    q.a=2
    w=A
    print(w.a)
    c=w()
    c.pl()
    print(w.a)
    print(c.a)
    
    点赞 2 评论 复制链接分享
  • weixin_43162240 Bryce__LY 4月前

    1.因为W和A是类  这是一种类型,需要实例化,就像有个玩偶的模具 这个模具是类  然后用这个模具做出来了一个玩偶  这个玩偶就是这个模具的实例化,实例化之后的self表示这个玩偶。   然后你那个函数有引用self,表示这是一个实例的函数,所以只能作用在实例(也就是加了括号之后的)。而a是类的属性,相当于模具的属性,所以不加括号就可以用。

    2.最后一个print是2是因为这个a是模具的属性,所以只有前面q那里改了一次,至于函数pl里面改的那个相当于你给玩偶加个蝴蝶结,那模具是没有改动的,所以模具是仍然没变的。

     

     

     

    点赞 1 评论 复制链接分享
  • qqzhuimengren PythonJavaC++go 4月前

    类变量可以类名. 调用,成员方法、成员变量只能通过实例化对象调用(带括号)

    点赞 1 评论 复制链接分享
  • u010249310 y2d1sm 4月前

    w=A,我忘记加括号了,所以迷惑了。多谢大神解惑!

    点赞 评论 复制链接分享
  • qqzhuimengren PythonJavaC++go 4月前

    a是类变量,pl方法是成员(对象)方法

    点赞 评论 复制链接分享