根据我的理解,在类方法中传递的第一个参数是类本身,其中定义了该类方法。例如,请考虑以下代码:
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类?
答案 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.__x
,A._A__x
变为B.__x
。这样可以确保您不会意外地在B._B__x
中的私有字段中使用与其类似名称的子类中选取字段。这就是名称存在的原因之一。
在第二种情况下,没有名称错误:您获得A
中定义的x
字段,即您调用方法的类。