python中类方法的第一个参数是什么?

时间:2016-10-25 14:35:40

标签: python python-2.7 class-method

根据我的理解,在类方法中传递的第一个参数是类本身,其中定义了该类方法。例如,请考虑以下代码:

class A(object):
    __x=10

    @classmethod
    def clam(cls,*args):
        print(cls.__x)

class B(A):
    __x=50

当我打电话时:

B.clam()

输出 10 根据我的理解,这是正常的,因为被调用的类方法在 A类中定义,因此 A类将隐式传递给 clam() __ x 的值 10

但是当我运行以下代码时:

class A(object):
    x=10

    @classmethod
    def clam(cls,*args):
        print(cls.x)

class B(A):
    x=50

当我打电话时:

 B.clam()

我的生命突然毁了。输出 50

两个案例之间的唯一区别是x在前者中是私有的。

究竟发生了什么?为什么后来的输出是50?是否有任何范围更改或突然传递给 A 中定义的类方法的第一个参数变为 B类

1 个答案:

答案 0 :(得分:1)

类方法中的第一个参数是您调用方法的类,而不是(必然)定义方法的类。 (拥有一个始终拥有相同类的变量可能不会那么有用。)

在第一种情况下,name mangling会区分这两个字段,以防止您意外地在子类中隐藏私有变量。字段mDatabase.child("student-timetables").child(courseOfStudent).addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(DataSnapshot snapshot) { if(!(snapshot.child("year").exist)) mDatabase.child("student-timetables").child(courseOfStudent).child("year").setValue(year); else Toast.maketext....."year exist.." if(!(snapshot.child(year).child("workshop-group").exist)) mDatabase.child("student-timetables").child(courseOfStudent).child(year).child("workshop-group").setValue(workshopGroup); else Toast.maketext....."workshopGroup exist.." } } 变为A.__xA._A__x变为B.__x。这样可以确保您不会意外地在B._B__x中的私有字段中使用与其类似名称的子类中选取字段。这就是名称存在的原因之一。

在第二种情况下,没有名称错误:您获得A中定义的x字段,即您调用方法的类。