在Python类的方法名前面加双下划线(__)可以让该方法在外部不可访问。python编辑器在编译python源代码时并没有将“__method2”方法真正私有化,而是一旦遇到方法名以双下划线(__)开头的方法,就会将方法名改成“_ClassName_methodName”的形式。其中,ClassName表示该方法所在的类名,“__methodName”表示方法名。ClassName前面要加上单下划线(_)前缀。
- 检测继承关系
1、判断类与类之间的关系可以使用issubclass函数,该函数接收两个参数,第1个参数是子类、第2个参数是父类。如果第一个参数指定的类与第二个参数指定的类确实是继承关系,那么该函数返回True,否则返回False。
# MyClass2是MyClass1的父类,返回True,否则返回False
issubclass(MyClass1, MyClass2)
2、使用isinstance函数检测一个对象是否是某一个类的实例。isinstance函数有两个参数,第1个参数是要检测的对象,第2个参数是一个类。如果第1个参数指定的对象是第2个参数指定的类的实例,那么该函数返回True,否则返回False。
person = Person()
# 如果person是Person类的实例,返回True,否则返回False
print(isinstance(person, Person))
注意:
使用issubclass函数检测类的继承关系时,不只是直接的继承关系返回True,间接的继承关系也会返回True。例如,A继承自B,B继承自C。那么issubclass(A,C)返回True。使用isinstance函数也是一样。
3、hasatter函数判断对象中是否存在某个成员
# c是一个对象,如果c中存在名为process的方法,hasattr函数返回True,否则返回False
print(hasattr(c, "process"))
还可以使用getattr函数实现同样的功能。该函数有三个参数,其中前两个参数与hasattr函数完全一样,第3个参数用于设置默认值。当第2个参数指定的成员不存在时,getattr函数会返回第3个参数指定的默认值。
与getattr函数对应的是setattr函数,该函数用于设置对象中成员的值。setattr函数有三个参数,前两个参数与getattr函数完全相同,第3个参数用于指定对象成员的值。
# 如果c对象中有name属性,则更新该属性的值,如果没有name属性,会添加一个新的name属性
setattr(c, "name", "new value")
class MyClass:
def method1(self):
print("method1")
def default(self):
print("default")
my = MyClass()
# 判断method1是否在my中存在
if hasattr(my, "method1"):
my.method1()
else:
print("method2方法不存在")
# 判断method2是否在my中存在
if hasattr(my, "method2"):
my.method2()
else:
print("method2方法不存在")
# 从my对象中获取method2方法,如果method2方法不存在,返回default方法作为默认值
method = getattr(my, "method2", my.default)
# 如果method2方法不存在,那么method方法实际上就是my.default方法
method()
def method2():
print("动态添加的method2")
# 通过setattr函数将method2函数作为method2方法的值添加到my对象中
# 如果method2方法在my中不存在,那么会添加一个新的method2方法,相当于动态添加method2方法
setattr(my, "method2", method2)
# 调用my对象中的method2方法
my.method2()
输出结果:
method1
method2方法不存在
default
动态添加的method2