面向对象编程进阶
Posted crazysheldon1
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面向对象编程进阶相关的知识,希望对你有一定的参考价值。
python内置函数
isinstance(obj,class)
判断一个对象是否是已知的类型,类似type()
isinstance语法:isinstance(object,classinfo)
- object 是实例/对象
- classinfo 可以是直接或间接类名,基本类型或者由他们组成的元组
返回值
如果对象的类型与classinfo相同,返回bool值True,否则返回False
isinstance 与type的区别:
- type()不会认为子类是一种父类类型,不考虑继承关系
- isinstance() 会认为子类是一种父类类型,考虑继承关系,
如果要判断两个类型是否相同的时候尽量用isinstance()
示例1:
a = [1,2,3] print(isinstance(a,list))
输出: True
示例2:
class A(object):pass class B(A):pass b=A() print(isinstance(b,A)) # 返回True b 是 A 的对象 print(type(b) is B) # 返回False b不是B类的对象 print(type(b) is A) #type 在这里是检测对象是不是类的对象/实例
issubclass( )
判断两个类是否有继承关系,,如果真的有继承关系,那就返回bool值True/False
class A(object):pass class B(A):pass print(issubclass(B,A)) # True B类是A类的子类 print(issubclass(A,B)) # False
内置方法
什么是内置方法?
内置方法也叫双下方法,魔术方法,它们在python中处处皆是,它们是一些可以让你对类添加"魔法"的特殊方法,经常都是双下划线包围来命名的比如(__init__,__str__)等等,到现在还是没有很好的办法来解释它们.
内置方法的特点
一定有某一个语法或者一种写法自动触发这个方法.
常见常用的内置方法
最常见的__init__ 是个初始化方法,类的初始化方法, 然而当我们执行 a =class()的时候,__init__并不是 第一个被调用的方法,事实上__new__第一个被调用,这个方法才真正的创建了实例/对象,当这个对象生命周期结束的时候,这时候__del__方法会被调用.看到这样的联系,让我们进一步了解他们的特性!
__new__ 也叫构造方法,__(cls,[...)__ 它提供了一个实例化对象的时候所需要的内存空间 例如--->创建空间
首先说说设计模式中的单例模式, __new__是对象实例化的时候第一个被调用的方法,它只取cls也就是类的参数,把其他参数传给__init__..
单例模式示例1
class Teacher2: flag = None #静态属性为空 def __new__(cls, *args, **kwargs): if cls.flag is None: #执行判断 cls.flag 也就是Teacher2类的静态属性为空的情况下 cls.flag = object.__new__(cls) #这句话直走一次 #Teacher2继承的父类 object.__new__(cls)开辟/构建的空间地址赋予Teacher2类的静态属性 print(cls.flag) return cls.flag #类的静态属性得到的空间地址赋值Sheldon2 Sheldon2 = Teacher2() ssa = Teacher2() #当ssa执行实例化的时候,flag 已经不等于None,而等于一个空间地址, 不走if判断,直接把原先的空间地址赋值给ssa
单例模式示例2
class Teacher: flag = None def __new__(cls,*args,**kwargs): # if cls.flag is None: cls.flag = object.__new__(cls) return cls.flag def __init__(self,name): self.name = name Sheldon = Teacher(‘Sheldon‘) Penny = Teacher(‘Penny‘) print(‘Sheldon.name‘) #输出 Sheldon print(‘Penny.name‘) #输出 Penny print(‘Sheldon.name‘) ##输出 Penny
__init__ (self[...) 类初始化方法
它获取任何传给构造器的参数,(例如Sheldon = Teacher(‘Sheldon‘) __init__ 就会接收到参数Sheldon. __init__在python类的定义中用的最多
__del__ (self) 析构方法
__del__ 是对象的销毁器,它并不是实现了语句中 del Sheldon 因此它并不等于 Sheldon.__del__(), 而是定义了对象的垃圾回收时的行为,当对象需要销毁时做的一些处理的时候,这个方法会用到,
class Teacher: def __init__(self,name): self.name = name def __del__(self): print(‘执行删除动作‘) Sheldon = Teacher(‘Sheldon‘) print(‘11111‘) # 输出顺序 11111 ---> 执行删除动作 ---> 删除Sheldon del Sheldon # 执行del 对象的时候触发了__del__ ,在真正删除Sheldon对象前,执行方法__del__ # 如果我们不删除 Sheldon ,那么程序的执行过程中或最后,垃圾回收机制会替你执行del Sheldon # del Sheldon ---> 执行__del--->删除Sheldon
...
以上是关于面向对象编程进阶的主要内容,如果未能解决你的问题,请参考以下文章
Python 进阶指南(编程轻松进阶):十六面向对象编程和继承