面向对象编程进阶(代码片段)

crazysheldon1 crazysheldon1     2023-01-26     678

关键词:

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内置函数isinstance(obj,class)  判断一个对象是否是已知的类型,类似type()isinstance语法:isinstance(object,classinfo)object是实例/对象classinfo可以是直接或间接类名,基本类型或者由他们组成的元组返回值如果对象的类型与classinfo相... 查看详情

python面向对象编程进阶(代码片段)

前言上上篇我们讲解了Python面向对象编程的基础知识,《Python基础篇:面向对象怎样炼成的》这篇我们继续来讨论面向对象编程相关的内容。目录前言可见性和属性装饰器动态属性静态方法和类方法继承和多态总结可见... 查看详情

面向对象编程进阶版(代码片段)

isinstance(obj,cls)和issubclass(sub,super)isinstance(obj,cls)检查obj是否是类cls的实例化对象issubclass(sub,super)检查sub类是否是super类的派生类#isinstance(obj,cls)检查obj是否是类cls的实例化对象classFoo(object):passclassFoo1(Foo):passobj= 查看详情

面向对象(进阶)(代码片段)

一.关于上篇面向对象(初识)总结:1.面向对象是一种编程方式,此编程方式的实现是基于对类和对象的使用2.类:是一个模板,模板中包装了多个"函数"供使用(可以讲多个函数中公用的变量封装到对象中)3.对象,根据模板创建的实例(即:... 查看详情

进阶学python:python面向对象基础!(代码片段)

什么是编程范式?在了解面向对象编程之前,我们需要了解三大编程范式以及其之间的区别和利弊即:面向过程编程、函数式编程、面向对象编程。编程:是程序员用特定的语法+数据结构+算法组成的代码来... 查看详情

python面向对象进阶(代码片段)

在前面的章节我们已经了解了面向对象的入门知识,知道了如何定义类,如何创建对象以及如何给对象发消息。为了能够更好的使用面向对象编程思想进行程序开发,我们还需要对Python中的面向对象编程进行更为深入的了解。@pr... 查看详情

面向对象进阶(代码片段)

元类1.类也是对象在大多数编程语言中,类就是一组用来描述如何生成一个对象的代码段。在Python中这一点仍然成立:>>>classObjectCreator(object):…pass…>>>my_object=ObjectCreator()>>>printmy_object<__main__.ObjectCreatorobjecta... 查看详情

面向对象编程-总复习(代码片段)

目录面向对象基础面向对象编程类与对象对象的属性的查找顺序给对象定制独有属性对象的绑定方法类与数据类型面向对象进阶类的继承类的派生类的组合菱形继承问题多态与多态性类的封装类的property特性类与对象的绑定方法... 查看详情

python面向对象编程进阶(代码片段)

前言上上篇我们讲解了Python面向对象编程的基础知识,《Python基础篇:面向对象怎样炼成的》这篇我们继续来讨论面向对象编程相关的内容。目录前言可见性和属性装饰器动态属性静态方法和类方法继承和多态总结可见... 查看详情

python面向对象编程进阶(代码片段)

前言上上篇我们讲解了Python面向对象编程的基础知识,《Python基础篇:面向对象怎样炼成的》这篇我们继续来讨论面向对象编程相关的内容。目录前言可见性和属性装饰器动态属性静态方法和类方法继承和多态总结可见... 查看详情

进阶学python:python面向对象系列之魔法方法!(代码片段)

本篇主要介绍面向对象编程中类的魔法属性,这些魔法属性均有其特殊的功能,即执行某些操作时,会自动触发这些魔法方法的执行,了解这些魔法方法可以更好的了解面向对象编程的实现原理;在学习魔法... 查看详情

面向对象——面向对象进阶(代码片段)

一、isinstance与issubclass方法1、isinstance是用来判断对象是否是某个类  isinstance(obj,class)2、issubclass是用来判断一个类是否为另一个类的子类  issubclass(Bar,Foo)1classFoo:2pass345classBar(Foo):6pass789obj=Foo()10print(isinstance(obj,Foo) 查看详情

面向对象进阶(代码片段)

isinstance和issubclassisinstance(obj,cls)检查是否obj是否是类cls的对象classFoo(object):passobj=Foo()isinstance(obj,Foo)  issubclass(sub,super)检查sub类是否是super类的派生类 classFoo(object):passclassBar(Foo):passissubcl 查看详情

面向对象进阶(代码片段)

isinstance和issubclassisinstance(obj,cls)检查是否obj是否是类cls的对象classFoo(object):passobj=Foo()isinstance(obj,Foo)issubclass(sub,super)检查sub类是否是super类的派生类 classFoo(object):passclassBar(Foo):passissubclas 查看详情

面向对象进阶(代码片段)

一、isinstance和issubclassisinstance(obj,cls)检查是否obj是否是类cls的对象classFoo(object):passobj=Foo()isinstance(obj,Foo)issubclass(sub,super)检查sub类是否是super类的派生类 classFoo(object):passclassBar(Foo):passissubcl 查看详情

java学习---面向对象进阶(代码片段)

面向对象进阶1、权限访问 1.1封装对象 1.2权限修饰符2、代码块 2.1普通代码块 2.2构造代码块 2.3静态代码块3、当前对象和父类对象的访问 3.1this(当前对象) 3.2super(父类对象)4、包 4.1包的含义 4.2包的使用... 查看详情

python进阶指南(编程轻松进阶):十六面向对象编程和继承(代码片段)

原文:http://inventwithpython.com/beyond/chapter16.html定义一个函数,并从几个地方调用它,可以省去复制和粘贴源代码的麻烦。不复制代码是一个很好的实践,因为如果你需要修改它(无论是为了修复一个错误还是添... 查看详情

面向对象进阶(代码片段)

反射实现通过字符串取出同名的变量反射对象中的属性和方法classPerson:city=‘zhengzhou‘defshow_info(self):print(‘info---‘)@classmethoddefshow_city(cls):print(‘city---‘)#使用类调用属性ifhasattr(Person,‘city‘):#先判断有没有,有再获取,防止没... 查看详情