博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
4-18 面向对象的进阶
阅读量:4314 次
发布时间:2019-06-06

本文共 2853 字,大约阅读时间需要 9 分钟。

1,isinstance

判断一个类和另一个类有没有(血缘)关系。type只能检测数据类型

class A:passclass B(A):passa = A()print(isinstance(a,A))print(isinstance(a,B))class A:passclass B(A):passa = A()print(type(a)is A)print(type(a)is B)

2,issubclass 检测两个类有没有继承关系

class B:passclass C(B):passclass D(C):passprint(issubclass(C,D))print(issubclass(D,C))print(issubclass(B,C))print(issubclass(C,B))print(issubclass(D,B))# issubclass(子类名,父类名) 如果返回True,说明有继承关系

3,最重要的反射

第一种:使用反射得到类的命名空间的名字  getattr()  和  hasattr ()

getattr()  从命名空间空间中得到这个名字对应的值。

hasattr()  判断一个命名空间中有没有这个名字 有True 无Flase

getaatr(类名,'名字')

class A:    role = 'Person'    def func(self):        print('*'*self)print(hasattr(A,'r'))print(hasattr(A,'role'))print(hasattr(A,'func'))ret = input('>>>')if hasattr(A,ret):    print(getattr(A,ret))     # getattr从A的命名空间里找一个属性 ,属性不存在会报错if hasattr(A,ret):    func = getattr(A,ret)    func(1)

第二种:反射得到对象使用的方法和属性

getattr(对象名,'名字')

class Teacher:    role = 'person'    def __init__(self,name):        self.name = name        self.money = 500    def func(self):        print('好好努力')alex = Teacher('alex')print(getattr(alex,'name'))getattr(alex,'func')()

第三种:使用模块中的模块名字

getattr(模块名,'名字')

import os;getattr(os,'rename')('user','user_info')
import timetime.time()print(time.time())print(getattr(time,'time')())

第四种:当前自己的模块使用自己的名字

import sys    getattr(sys.modules['__main__'],名字)

def login():    print('执行login功能')def register():    print('执行register功能')import sys  # 和python解释器相关的内容都在sys里print(sys.modules['__main__'])func = input('>>>')if hasattr(sys.modules['__main__'],func):    getattr(sys.modules['__main__'],func)()

5,反射的内置函数

getattr,hasattr,setattr,delattr.

getattr()  从命名空间空间中得到这个名字对应的值。

hasattr()  判断一个命名空间中有没有这个名字 有True 无Flase

setattr()  增加和改对象属性和方法

delattr() 删除对象的属性和方法

class A:    def __init__(self,name):        self.name = name    def wahaa(self):        print('ssdas')a = A('alex')a.wahaa()getattr(a,'name')# a.age = 18# print(a.__dict__)setattr(a,'age',18)setattr(a,'name','egon')print(a.__dict__)delattr(a,'name')print(a.__dict__)
class A:    def __init__(self,name):        self.name = name    def wahaha(self):        print('wahahahahaha')def qqxing(self):    print('qqqqqxing')a = A('alex')# setattr(A,'qqxing',qqxing)setattr(a,'qqxing',qqxing)# print(a.__dict__)a.qqxing(a)

 6,内置方法__len__和__hash__

有一个内置函数和内置方法len()是唯一对应的关系

class A:    def __init__(self,name,age,sex,hobby):        self.name = name        self.age = age        self.sex = sex        self.hobby = hobby    def __len__(self):        return len(self.__dict__)alex = A('alex',33,'male','girl')egon = A('egon',23,'female','抽烟')alex.money = 200print(len(alex))

hash方法

class A:    def __init__(self,name,age,sex,cls):        self.name = name        self.age = age        self.sex = sex        self.cls = cls    def __hash__(self):        return 0a1 = A('alex',81,'不详',2)print(hash(a1))

 

转载于:https://www.cnblogs.com/yzxing/p/8876359.html

你可能感兴趣的文章
我的大学生活-5-08-赵心宁
查看>>
入门阶段
查看>>
Android中使用http协议访问网络
查看>>
Join 与 CountDownLatch 之间的区别
查看>>
vc6下dll调试
查看>>
Ubuntu apt常用命令
查看>>
struts2 配置(部分)
查看>>
python代码迷之错误(ModuleNotFoundError: No module named 'caffe.proto')
查看>>
nodejs adm-zip 解压文件 中文文件名乱码 问题解决
查看>>
<Bootstrap> 学习笔记六. 栅格系统使用案例
查看>>
vector--C++ STL 学习
查看>>
蜕变成蝶~Linux设备驱动之异步通知和异步I/O
查看>>
jquery简单开始
查看>>
作业2
查看>>
ios上架报错90080,90087,90209,90125 解决办法
查看>>
给button添加UAC的小盾牌图标
查看>>
如何退出 vim
查看>>
Robberies
查看>>
get post 提交
查看>>
R安装
查看>>