isinstance,issubclass,反射,双下方法

1.isinstance判断对象的所属类型包括继承

例:

class A:pass
class B(A):pass
b = B()
print(isinstance(b,B))    ==>True
print(isinstance(b,A))    ==>True

例:

class My(str):pass
me = My("小白")
print(type(me) is str)          ==>False        #不包含继承,只管一层
print(isinstance("小白",str))    ==>True         #包含所有的继承关系

  issubclass判断两个类的关系

例:

class A:pass
class B(A):pass
print(issubclass(B,A))   ==>True
print(issubclass(A,B))  ==>False

2.反射  用字符串数据类型的变量来访问这个变量的值   (getattr,hasattr,setattr,delattr)

类:语法:getattr(类名,"变量/方法名")    命名空间.变量/方法名 <==> getattr(命名空间,"变量/方法名") 

(1)反射查看静态属性  

例:

class Student:
    ROLE = "student"
print(getattr(Student,"ROLE"))   ==>student     #第一个参数的命名空间中的变量名为第二个参数的变量的值

(2)反射调用方法

例:

class Student:
    @classmethod
    def check_course(cls):
        print("查看课程")
    @staticmethod
    def login():
        print("登录成功")
getattr(Student,"check_course")()    ==>查看课程     #类方法
getattr(Student,"login")()           ==>登陆成功     #静态方法

num = input(">>>>")           ==> >>>>login
if hasattr(Student,num):          登录成功
    getattr(Student,num)()

对象:语法:getattr(对象,"方法名")

例:

class Student:
    def __init__(self,name):
        self.name = name
    def func(self):
        print("in func")
s = Student("小白")
getattr(s,"func")()       ==>in func

模块:语法:getattr(模块名,"模块内部的方法名")   

例:

import os      #别人写好的python代码结合
getattr(os,"rename")("a","a.txt")  <==>  os.rename("a","a.txt")   #将名为a的文件改命名为a.txt

自己模块中的内容:

例:

import sys       #导入一个模块,sys模块,这个模块里的所有的方法都是和python解释器相关的
def wahaha():
    print("wahaha")
def qqxing():
    print("qqxing")
print(sys.modules["__main__"])       #sys.mudules这个方法表示所有在当前这个python程序中导入的模块
file = sys.modules["__main__"]
getattr(file,"wahaha")()
结果:<module '__main__' from 'F:/面向对象/18.07.30/课堂练习.py'>
   wahaha

setattr(对象,属性名,新值)   修改属性值

delattr(对象,"属性名")    删除属性

例:

class A:
    def __init__(self,name):
        self.name = name
a = A("小白")
setattr(a,"name","小白1")
print(a.name)               ==>小白1

delattr(a,"name")
print(a.__dict__)           ==>{}

3.__名字__    (双下方法,魔术方法,类中的特殊方法,内置方法)

类中的每一个双下方法都有自己的特殊意义

(1)__call__                 对象()  <==>  类名()()

 例:

class A:
    def __call__(self, *args, **kwargs):
        print("in call")
a = A()     <==>   A()()
a()        ==>in call       #调用__call__方法

 例:

class A:
    def __call__(self, *args, **kwargs):
        print("in call")
class B:
    def __init__(self,cls):
        self.a = cls()     #实例化A类  self.a是A的对象
        self.a()
B(A)        ==>in call

(2)__len__    len(obj)相当于调用这个对象的__len__方法

例:

class My:
    def __init__(self):
        self.lst = [1,2,3,4,5]
        self.name = "小白"
    def __len__(self):
        return len(self.lst)
l = My()
print(len(l))     ==>5

例:

class My:
    def __init__(self):
        self.lst = [1,2,3,4,5]
        self.name = "小白"
    def __len__(self):
        return len(self.__dict__)      #return的值就是len函数的返回值
l = My()
print(len(l))       ==>2

 如果一个函数没有__len__方法那么len函数会报错

 (3)__new__是构造函数 

在实例化之后,执行__init__函数之前,先执行__new__函数来创建一块空间

例:

class Single:
    def __new__(cls, *args, **kwargs):
        obj = object.__new__(cls)
        return obj
    def __init__(self):
        print("在 init")
a = Single()        ==>在 init

例:单例类

class Single:
    __ISINSTANCE = None
    def __new__(cls, *args, **kwargs):
        if not cls.__ISINSTANCE:          #第一次实例化之后if判断为True 之后再实例化if判断都为False
            cls.__ISINSTANCE = object.__new__(cls)
            return cls.__ISINSTANCE
    def __init__(self,name,age):      #self = cls.__ISINSTANCE
        self.name = name
        self.age = age
s1 = Single("小黑",18)
s2 = Single("小白",20)
print(s1,s2)    ==><__main__.Single object at 0x0000018A9E1E00B8> <__main__.Single object at 0x0000018A9E1FF908>

(4)__str__

例:

class Student:
    def __str__(self):
        return "%s %s %s" % (self.name,self.sex,self.age)
    def __init__(self,name,sex,age):
        self.name = name
        self.sex = sex
        self.age = age
s = Student("小白","",20)
print(s)                ==>小白 男 20        #print一个对象相当于调用一个对象的__str__方法
print(str(s))      ==>小白 男 20        #str(obj)相当于执行__str__方法
print("学生:%s" % s)   ==>学生:小白 男 20     #"%s" % obj 相当于执行obj.__str__方法

 所有的双下方法,没有需要我们在外部直接调用的 总有一些其他的内置函数特殊方法来自动触发这些双下方法

猜你喜欢

转载自www.cnblogs.com/wangjian941118/p/9400150.html