码迷,mamicode.com
首页 > 其他好文 > 详细

18.07.30(isinstance,issubclass,反射,双下方法)

时间:2018-07-31 11:09:27      阅读:148      评论:0      收藏:0      [点我收藏+]

标签:面向对象   iss   asa   程序   init   ini   method   构造   实例化   

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,反射,双下方法)

标签:面向对象   iss   asa   程序   init   ini   method   构造   实例化   

原文地址:https://www.cnblogs.com/gxj742/p/9393132.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!