18.07.30(isinstance,issubclass,反射,双下方法)
Posted gxj742
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了18.07.30(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 __call__(cls, *args, **kwargs):
obj = object.__new__(cls)
return obj
def __init__(self):
print("在 init")
a = Single() ==>在 init
例:单例类
class Single:
__ISINSTANCE = None
def __call__(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__方法
所有的双下方法,没有需要我们在外部直接调用的 总有一些其他的内置函数特殊方法来自动触发这些双下方法
---恢复内容结束---
以上是关于18.07.30(isinstance,issubclass,反射,双下方法)的主要内容,如果未能解决你的问题,请参考以下文章
isinstance('aaa', basestring) 和 isinstance('aaa', str) 有啥区别?