目录

  • 第四十四篇 面向对象高阶

    • 一、isinstance()和issubclass()

      • 1.isinstance()
      • 2.issubclass()
    • 二、反射
      • 1.__import__()
      • 2.hasattr()
      • 3.getattr()
      • 4.setattr()
      • 5.delattr()
    • 三、call() 和 new()
      • 1.__call__()
      • 2.__new__()
    • 四、元类
    • 五、单例模式
    • 六、异常处理

第四十四篇 面向对象高阶

一、isinstance()和issubclass()

1.isinstance()

判断对象是否为这个类实例化出来的,也会检测父类(比较数据类型推荐使用)

class Foo:passclass Bar(Foo):passobj = Bar()
# isinstance 可以检测到父类
print(isinstance(obj,Foo)) # True
print(isinstance(obj,Bar)) # True
print(isinstance(Bar,Foo)) # False# type 只检测到类
print(type(obj) == Bar) # True
print(type(obj) == Foo) # False
print(type(obj))  # <class '__main__.Bar'>
print(type(Bar()))  # <class '__main__.Bar'>
print(type(Foo()))  # <class '__main__.Foo'># type 获取实例化对象的类,不会检测父类,可以用于生成类(type是元类)

2.issubclass()

比较判断某个类是否为另一个类的子类

class Foo:pass
class Bar(Foo):passprint(issubclass(Bar, Foo))

二、反射

1.__import__()

通过字符串导入模块

time = __import__('time')
print(time.time())

2.hasattr()

hasattr:通过字符串判断是否类属性存在

class Foo:def eat(self):print('rice')f = Foo()
print(hasattr(f,'eat'))  # True

3.getattr()

getattr:通过字符串获取类属性

class Foo:def eat(self):print('rice')f = Foo()
print(getattr(f,'eat')) # 得到一个方法对象和地址
print(getattr(f,'eat')())
'''
rice
None  # 返回值为空
'''

4.setattr()

setattr:通过字符串修改类属性。如果有就修改,没有就添加

class Foo:def eat(self):print('rice')f = Foo()
setattr(f,'eat','fruit')
print(f.__dict__)  # {'eat': 'fruit'}
setattr(f,'play','game')  # {'eat': 'fruit', 'play': 'game'}

5.delattr()

delattr:通过字符串删除类属性

class Foo:def eat(self):print('rice')f = Foo()
print(f.__dict__)   # {'eat':'rice'}
delattr(f,'eat')
print(f.__dict__)  # {}

三、call() 和 new()

1.__call__()

**cls()()就会触发__call__()**

class Foo:def __init__(self):print('Foo()会触发,也就是实例化对象时触发')def __call__(self):print('Foo()()会触发,也即是对象调用方法时触发(其实主要用于元类中)')obj = Foo()  # Foo()会触发...
obj()  # Foo()()会触发...

2.__new__()

1.用于实例化一个空对象时使用

**2.__new__(cls,*more),它的上面是一个非绑定方法装饰器@staticmethod**

class Foo:def __new__(self):  # self:类本身 print('__new__')obj = object.__new__(self) # 实例化一个空对象。self:类本身
'''obj = self.__new__(self) 这样会出错,可以将self换成其他有__new__()方法的类,object作为基类就有__new__()方法'''return objdef __init__(self):  # self 对象本身print('__init__')f = Foo()

四、元类

1.元类用来造类的

**2.元类(),会触发__init__()生成类(元类实例化)**

**3.元类()(),会触发__call__()生成对象(类实例化)**

4.类分为几部分:class_name类名/class_dict类体名称空间/class_bases父类们

5.对象的属性查找顺序:对象---->类---->父类(如果有其他父类,也会广度优先查找其他父类)---->祖宗类---->object类---->自定义元类---->type

# 第一种方法造类:使用type模仿class关键字造类# 步骤:
# 1.类名class_name:比如 Foo
# 2.类体代码class_body:开辟内存空间,把属性/方法放入一个名称空间(造好了才会有名称空间:如 Foo.__dict__),用class_dict来接
# 3.父类(基类)class_bases:(object,)
# 4.exec() 方法:会把字符里的代码运行,并且放入名称空间class_name = 'Foo'
class_bases = (object,)
class_body = '''
def __init__(self,name):self.name = name
def speak(self):print('666')
'''
class_dict = dict()
exec(class_body,{},class_dict)  # 将类体代码中的名字放入名称空间
cls_foo = type(class_name,class_bases,class_dict)  # 元类实例化,生成类
obj = cls_foo('king')  # 类实例化,生成对象# 第二种方法造类:使用元类造类(可以控制造类的过程)
class MyMeta(type):  # 同样需要type元类来帮自定义的元类实例化一个类def __init__(self,class_name,class_bases,class_dict):# 利用type元类来实例化一个类# 可以在这个位置加上逻辑代码,控制类的产生if not class_name.title():raise TypeError('类名首字母必须大写')super().__init__(class_name,class_bases,class_dict) class Foo(object,metaclass=MyMeta):  # metaclass=MyMeta是关键def __init__(self):passobj = Foo()  # 实例化一个对象# 控制对象的产生
class MyMeta(type):def __init__(self,class_name,class_bases,class_dict):# 这个位置控制类的产生super().__init__(class_name,class_bases,class_dict)def __call__(self,*args,**kwargs):# 控制实例化对象时参数的传递obj = self.__new__(self)self.__init__(obj,*args,**kwargs)# 控制对象的产生return objclass Foo(object,metaclass=MyMeta):def __init__(self):passobj = Foo()

五、单例模式

1.单例模式(Singleton Pattern):是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场。

比如,某个服务器程序的配置信息存放在一个文件中,客户端通过一个 AppConfig 的类来读取配置文件的信息。如果在程序运行期间,有很多地方都需要使用配置文件的内容,也就是说,很多地方都需要创建 AppConfig 对象的实例,这就导致系统中存在多个 AppConfig 的实例对象,而这样会严重浪费内存资源,尤其是在配置文件内容很多的情况下。事实上,类似 AppConfig 这样的类,我们希望在程序运行期间只存在一个实例对象。

2.实现方法有许多种,我们来介绍下面这三种

  • 1.利用类绑定方法
NAME = 'king'
class Foo:__instance = None  # 定义一个隐藏的类属性,用于接住实例化对象并返回def __init__(self, name):self.name = name@classmethod   # 类绑定方法def func(cls):if cls.__instance:  # 第一次不走这里return cls.__instance  # 第一次之后返回的都是相同的对象obj = cls(NAME)  # 这里写死了,只能接收NAME,所以只能实例化同一个对象cls.__instance = obj  # 类的__instance属性同样写死了,只能是这个对象了return cls.__instancef = Foo.func()  # <__main__.Foo object at 0x000002079E3FC7B8>
f1 = Foo('jojo')  # <__main__.Foo object at 0x000002079E3FC7B8>
  • 2.利用装饰器
NAME = 'king'# 传入类的装饰器
def deco(cls):cls.__instance = cls(NAME)  # 实例化一个固定的对象def wrapper(*args,**kwargs):if len(args) == 0 and len(kwargs) == 0:return cls.__instance  # 当不传参时,就是固定的对象return cls(*args,**kwargs)  # 传参之后就返回定制的对象return wrapper@deco
calss Foo:def __init__(self, name):self.name = nameobj = Foo()
  • 3.利用元类(重要)
NAME = 'king'# 元类
class MyMeta(type):def __init__(self,class_name,class_bases,class_dict):super().__init__(self,class_name,class_bases,class_dict) # 实例化一个类self.__instance = self(NAME)  # 实例化一个对象def __call__(self,*args,**kwargs):if len(args) == 0 and len(kwargs) == 0:return self.__instanceobj = self.__new__(self)       # 实例化一个空对象self.__init__(obj,*args,**kwargs)  # 初始化对象return objclass Foo(object,metaclass=MyMeta): # 会先去MyMeta中实例化一个类def __init__(self,name):self.name = nameobj = Foo() # 实例化一个对象

六、异常处理

# 1.捕捉异常
try:# 疑似有问题的代码,可以通过这个方法查看是否有报错
except:print('error')# 2.Exception 万能捕捉
try:# 疑似有问题的代码,可以通过这个方法查看是否有报错
except Exception as e:print(e)# 3.finally 无论是否报错,都会执行后面的代码,一般用于文件的关闭(不推荐)
try:# 疑似有问题的代码,可以通过这个方法查看是否有报错
except Exception as e:print(e)
finally:print('keep')# 4.raise() 主动抛出异常
try:# 代码块raise NameError('not defind')
except NameError as e:print(e)# 5.assert 断言,用于预估代码会出错,给个标记,方便报错时查找(不推荐)
x = 0
y = x**2
assert y!=2

转载于:https://www.cnblogs.com/itboy-newking/p/11072045.html

第四十四篇 面向对象高阶相关推荐

  1. 发表Nature等杂志四十多篇论文老师带您学单细胞测序数据挖掘和课题设计 2020年1月11-12日 上海...

    两天一夜高强度训练,理论与实战相结合 赠送高清视频供学员复习使用 授课老师   来自中科院,长期从事单细胞多组学方面的项目研究,发表Nature等杂志四十多篇论文,目前承担国家科技部.国家自然基金委和 ...

  2. 定积分华里士公式推广_分部积分法与点火公式|第四十六回|高数(微积分)...

    原标题:分部积分法与点火公式|第四十六回|高数(微积分) 之前几次我们都在讲定积分计算的换元法,换元法对于定积分的计算确实很重要,也非常好用,因为定积分的结果是一个固定的数,所以相比于不定积分的换元法 ...

  3. [系统安全] 四十四.APT系列(9)Metasploit技术之基础用法万字详解及防御机理

    您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列.因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全.逆向分 ...

  4. 【Visual C++】游戏开发笔记四十四 浅墨DirectX教程十二 网格模型和X文件使用面面观

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接: http://blog.csdn.net/zhmxy555/article/details/8586540 作者:毛星云(浅墨 ...

  5. 1977-2021 高考四十四年,哪一张照片是属于你的记忆(珍贵!)

    1977-2019 四十四年高考 一个国家命运的拐点 千百万个人生的转折 1977 四十四年     四十四图 1977年12月10日的高考, 是中国历史上唯一的一次冬季高考. 这一天,570多万从农 ...

  6. 【Visual C++】游戏开发笔记四十四 浅墨DirectX教程十二 网格模型和X文件使用面面观...

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接:http://blog.csdn.net/zhmxy555/article/details/8586540 作者:毛星云(浅墨) ...

  7. 四十四、深入Java 的序列化和反序列化

    @Author:Runsen @Date:2020/6/8 作者介绍:Runsen目前大三下学期,专业化学工程与工艺,大学沉迷日语,Python, Java和一系列数据分析软件.导致翘课严重,专业排名 ...

  8. 【正点原子FPGA连载】第四十四章MT9V034摄像头HDMI显示实验 -摘自【正点原子】新起点之FPGA开发指南_V2.1

    1)实验平台:正点原子新起点V2开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=609758951113 2)全套实验源码+手册+视频下载地址:ht ...

  9. Python编程基础:第四十四节 方法重写Method Overriding

    第四十四节 方法重写Method Overriding 前言 实践 前言 我们前面说了,子类继承于父类,可以调用父类的所有属性和方法.那么如果我们想在继承的过程中重新书写父类的某些方法,此时就用到了方 ...

  10. 四十四种Javascript技巧大全

    四十四种Javascript技巧大全 1.第一个给变量分配值时不要忘了var关键字. 分配值给未定义的变量将是该变量自动成为全局变量,应该避免全局变量. 2.使用 === 而不是 == 使用 == ( ...

最新文章

  1. 如何给前三条最新信息旁边加上一个红旗
  2. 自动驾驶汽车测试在美惹争议,原因为何?
  3. 2021年春季学期-信号与系统-第八次作业参考答案-第七小题
  4. cve-2019-10758 mongo-express rce 漏洞分析
  5. python class 属性是什么_python class 的属性
  6. python读取rar文件_在 python 中,如何读取由 7z 压缩的文本文件_python_酷徒编程知识库...
  7. oracle 表导入到powerDesigner 中
  8. java获取网络带宽_Linux Java 获取CPU使用率,内存使用率,磁盘IO,网络带宽使用率等等...
  9. 我们能用 lua 做什么
  10. 输油管道问题 测试数据_建立测试时要考虑的数据管道
  11. HADOOP再进阶:本地Yum软件源安装Cloudera Manager 5
  12. 5V 升压 8.4V供电5V 转转 8.4V 做两节锂电池充电芯片FS2114
  13. 鸡兔同笼:35个头,94只脚,问鸡、兔各多少只?
  14. 解决Linux上rar压缩包文件无法解压缩的问题
  15. Function.identity()初探
  16. Alarm Clock Pro for mac(闹钟和时间管理工具)
  17. 画质增强概述-1-定义
  18. 关于C语言中的宏的一点点讨论
  19. Python之freshman08 Socket
  20. 判断一个点是否在圆内

热门文章

  1. oracle vm 加大存储,Oracle VM VirtualBox下ubuntu虚拟机存储空间不够解决方案
  2. 排名算法(三)--排序学习
  3. 运动目标跟踪(十六)--OAB,SemiT,BSBT跟踪
  4. DSP之时钟与定时器之三RTC
  5. 剑指offer(面试战备ing,持续更新)
  6. C语言:从键盘输入10个学生的成绩存储在数组中,求成绩最高者的序号和成绩
  7. Linux内核开发_内核模块
  8. LeetCode 144 ——二叉树的前序遍历
  9. Orcale分析函数OVER(PARTITION BY... ORDER BY...)的讲解
  10. 数据库链接池c3p0的配置