issubclass、isinstance、hasattr、 getattr、setattr

在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
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 写在前面的话 代码中的# > 表示的是输出结果 输入 使用input()函数 用法 注意input函数输出的均是字...
    FlyingLittlePG阅读 8,117评论 0 9
  • 内置函数Python解释器内置了许多功能和类型,总是可用的。他们是按字母顺序列在这里。 abs(x)返回一个数的绝...
    uangianlap阅读 5,025评论 0 0
  • # 第一优先级规则声明: # 除了梦境,每一个意识主进程都必须与一个身体参与的机械进程相匹配,否则结束意识主进程。...
    李洞BarryLi阅读 9,339评论 0 1
  • 1. abs(x) abs()函数返回数字(可为普通型、长整型或浮点型)的绝对值。如果给出复数,返回值就是该复数的...
    TENG书阅读 3,101评论 0 0
  • “北方初雪,万物可爱,可万物的可爱不及你的万分之一” 冬天就这么来了,很庆幸在入冬前的最后一个晴天,去爬了岳麓山,...
    SHERO扬阅读 864评论 0 0