面向对象编程进阶

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 进阶指南(编程轻松进阶):十六面向对象编程和继承

Python基础-week06 面向对象编程进阶

Python7 - 面向对象编程进阶

进阶学Python:Python面向对象基础!

Python基础-第七天-面向对象编程进阶和Socket编程简介

Python之路,Day8 - 面向对象编程进阶