十七、面相对象的进阶
内置方法
isinstance 只能判断是否为父子类的关系 不能判断爷爷和孙子的关系(False)
issubclass 判断是否有继承关系 只要有继承关系都为真
class C:def func(self):pass class A(C):def func1(self):print(444) class B(A):def func2(self):print(66)print(issubclass(B,C)) B与C是继承关系 print(isinstance(B,C)) B与C是继承关系不是父类与子类关系 ##### True Flse
反射
类中反射
对象反射
class A:b = '666'def func(self):print(333) a = A() print(getattr(A,'b')) 类反射 c = getattr(a,'func') 对象反射 d = c() #### 666 333
模块反射
import osgetattr(os,'rename')('hehe','fuck')
自己反射
getattr和hasattr
import sys
def login():print('登陆成功')
def register():print('注册成功')
func = input('请输入')
if hasattr(sys.modules['__main__'],func):getattr(sys.modules['__main__'],func)()
增删改对象的属性,和类的属性增删改
setattr delattr
class A: bb = 'haha' 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__)print(a.__dict__)a.qqxing() delattr(A,'bb') 删除类的静态属性delattr(A,'qqxing') 删除类的动态属性print(A.__dict__)a.qqing(a) 为对象增加的方法的调用方式,要传参
__str__ 和 __repr__
这里需要说明的是,其实所有的输出我们能够看得见的都是在输出在文件上的,比如说cmd,pycharm 只不过是特殊的文件形式罢了,所以所有的print的结果都是字符串形式,只是每个不同的数据类型所在的类中的方法又做了不同的处理。我们平时在pycharm中正常的print可以打印出我们想要的东西,只不过是调用了别的类中的__str__的方法。而当我们定义一个类的时候,我们在类中print(对象名) 时,如果类中没有单独定义__str__ 和__repr__的方法,则会调用父类object中的方法,而object中的__str__ 和__repr__就是返回的内存地址。所以由此可见如果我们自己定义这些内置方法就可以输出我们想要的结果
class Teacher:def __init__(self,name,age):self.name = nameself.age = agedef __str__(self):return "Teacher's object %s"%self.namedef __repr__(self):return 'repr function %s'%self.name
a = Teacher('alex',80)
b = Teacher('egon',80)
print(str(a))
print(repr(a))
print(a)
print(b)
#####
Teacher's object alex
repr function alex
Teacher's object alex
Teacher's object egon可以看到 当__str__ 和 __repr__同时存在时 print默认去找str方法
class Teacher:def __init__(self,name,age):self.name = nameself.age = age# def __str__(self):# return "Teacher's object %s"%self.namedef __repr__(self):return 'repr function %s'%self.name a = Teacher('alex',80) b = Teacher('egon',80) print(str(a)) print(repr(a)) print(a) print(b) 当我们把str方法注释掉的时候 print自动去找了repr的方法 而print(str())也去找了repr的方法
class Teacher:def __init__(self,name,age):self.name = nameself.age = agedef __str__(self):return "Teacher's object %s"%self.name# def __repr__(self):# return 'repr function %s'%self.name a = Teacher('alex',80) b = Teacher('egon',80) print(str(a)) print(repr(a)) print(a) print(b) ##### acher's object alex <__main__.Teacher object at 0x000002201ED825F8> Teacher's object alex Teacher's object egon 把repr的方法注释掉的时候,print都去找了str的方法,而print(repr())的方法直接去找了父类object的repr的方法打印了内存地址 我们的出来结论:
1.当两种方法同时存在时,print默认去找str的方法 2,当str不存在的时候就都可以去找repr 包括print(str()) 3,当repr不在时,正常的print都会找str 而print(repr())则会去找父类的repr 输出内存地址 4,repr是str的备胎 没有了str都可以用repr 都在时又不用他优先用str
__new__
设计模式:单例模式 就是一个类中只有一个实例
class B:__instance = None #定义一个实例def __new__(cls, *args, **kwargs):if cls.__instance is None:obj = object.__new__(cls) 创建了一个新的空间赋给了__instance 这时候__instance不再是None cls.__instance = objreturn cls.__instancedef __init__(self,name,age):self.name = nameself.age = agedef func(self):print(self.name) a = B('alex',80) b = B('egon',20) print(a) print(b) print(a.name) print(b.name) #### egon egon这段代码中 后面实例化都是在一个内存空间中进行所以 后面每次实例化新对象都是在一个内存空间 新的把旧的覆盖
__item__
增删改
class Foo:def __init__(self,name):self.name=namedef __getitem__(self,item):return self.__dict__[item]def __setitem__(self, key, value):self.__dict__[key]=valuedef __delitem__(self, key):print('del obj[key]时,我执行')self.__dict__.pop(key) a = Foo('aa') print(a['name']) a.age = 18 a['age'] = 22 a.age = 23 del a['age'] print(a.age) f = Foo('alex') # f.name = ... print(f['name']) # f.__getitem__('name') f['age'] = 18 # 赋值 print(f.age) # 自带的语法 print(f['age']) # 修改 f['age'] = 80 print(f['age']) # 通过实现__getitem__得到的 del f['age'] print(f.age) # 删除
十七、面相对象的进阶相关推荐
- Bootstrap基础二十七 多媒体对象(Media Object)
Bootstrap<基础二十七> 多媒体对象(Media Object) 原文:Bootstrap<基础二十七> 多媒体对象(Media Object) Bootstrap 中 ...
- Java开发知识之Java面相对象
Java开发知识之Java面相对象上 一丶什么是面相对象 了解什么什么是面相对象.那么首先要了解什么是面相过程. 面相过程的意思就是. 什么事情都亲力亲为. 比如上一讲的排序算法. 我们自己写的. 这 ...
- java属于面相_[Java教程]面相对象
[Java教程]面相对象 0 2018-09-13 16:00:26 面向对象 那什么是面向对象? 在Java 中,我们是一切皆对象,所有的方法都是围绕着对象来的.面相对象是相对面向过程而来的,他们都 ...
- 还不会python面相对象?活该单身(面向对象基础+交互关系)
文章目录 概述 名词解释 类的定义 类的实例化 类属性 两个对象的交互 依赖关系 关联关系 组合关系 类变量的用途 概述 活在当下的程序员应该都听过"面向对象编程"一词,之前太懒了 ...
- (转)AS3 面相对象 高级话题
官方帮助上的一段文章,大致了解了下as3的一些机制.由于各方面水平都比较菜,所以翻译出来的,可能比一直被我鄙视的"国人翻译的东西"还要差.不过我已尽力而为了,希望看的朋友包含,如果 ...
- C++面相对象学习总结
C++面相对象学习总结 指针与引用 指针就是地址,定义一个指针的时候可以初始化也可以在随后再初始化 在指针定义的时候的*表示后面的是指针,而在程序运行执行的过程中的*是一个指针运算符,*p表示指针p指 ...
- go语言学习-面相对象
为什么80%的码农都做不了架构师?>>> go 面相对象 只保留了组合(composition)这个最基础的特性 对象传递 Go语言和C语言一样,类型都是基于值传递的.要想修改 ...
- java面相对象基础知识1
什么是面相对象 用人的世界观去改变计算机的世界观(人的想法,让计算机按照人的思维去实现出来) 1.1 对象 (万物皆对象) 静态:说明是什么 动态:说明做什么 1.2. 类 具有相同属性(静态)和行为 ...
- Python-面向对象(进阶)
一.什么是反射 反射的概念是Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发了计算机科学领域关于用于反射性的研究.它首先被程 ...
- day18-面向对象程序进阶和继承(10.13)
day18- 面向对象程序进阶和继承(10.13) 1.作业讲评-倒计时计时器 import timeclass CountdownClock:"""倒计时计时器&quo ...
最新文章
- 让Everest 0.6支持Intel 82852/82855 GM/GME显卡图形登录
- CentOS7.X的系统管理、安全设置及系统优化思路
- golang中变量使用情况
- java 表单请求_java模拟表单请求
- 【高等数学】高等数学基础理论归纳
- 那天,他无意间瞟了眼程序员的桌面……
- 全连接层的作用是什么?
- verilog中signed的使用
- 微信小程序体验版、正式版的发布流程
- 使用PS将图片自然从清晰到模糊过渡
- 大学计算机python基础_大学计算机python基础课件2015lecture17
- python 高斯过程_1.7. 高斯过程
- 使用DOS命令操作MySQL
- Java实现哥德巴赫猜想
- Android Q适配攻略(一)(图标适配)
- 推动人工智能教育发展,创新学校高质量发展模式
- 有梦为马,追寻梦想——基层优秀教育工作者佟鑫海
- Mac与Linux的文件系统,Apple为iOS和macOS提供全新文件系统APFS
- 手机摄影最常用的 5 种构图方式
- 龙傲天程序员之路 其一
热门文章
- neo4j-入门---学习复杂关系使用CQL语句操作图数据库(二)
- iOS16更新后打不开微信 解决办法来了
- 微型计算机的中央处理器由什么组成,中央处理器由什么组成?
- 慕尼黑大学计算机硕士专业,德国可以申请的英语授课的计算机硕士有哪些学校?...
- 硬件设计之DDS AD9854
- eclipse新建JSP页面报错:Multiple annotations found at this line解决方法
- YOLOv1: You Only Look Once: Unified, Real-Time Object Detection
- vulcan测试记录
- 终于等到你:国内黑客团队360Vulcan公布iOS 12.1越狱漏洞细节
- 华为耳机登陆天宫空间站 降噪科技成关键因素