python面向对象编程4(self对象、对象内置函数、单例、新式类和经典类)

python面向对象编程

一、self对象

class Person:
    def __init__(self,x,y):
        self.name=x
        self.age=y
        
p1=Person('Jack',19)

  当创建了一个实例对象p1时,Python底层会进行如下操作

          1、调用__new__方法,用来申请内存空间

          2、调用__init__方法传入参数,将self指向创建好的内存空间,填充数据

          3、变量p1也指向创建好的内存空间

 

       动态属性

       1、p1.city='Beijing'

            给对象属性赋值,如果这个属性以前不存在(__init__方法没定义),会给对象添加一个新的属性。

        2、p1.name='Rose'
            给对象属性赋值,如果这个属性类中存在,则会修改对象所对应属性的值。
 
        3、如果要限制类中的属性,可以使用__slots__(属性名)来限制,在类中直接定义,格式:

class Person:
    __slots__=('name','age')   #用来规定对象可以存在的属性
    
    def __init__(self,x,y):
        self.name=x
        self.age=y

  其他属性就不能再动态定义了。

 

二、对象内置函数

        python中的身份运算符用来判断两个对象是否相等;isinstance用来判断对象和类之间的关系;issubclass用来判断类和类之间的关系。

       1、身份运算符

       身份运输符用来比较两个对象的内存地址,看这两个对象是否是同一个对象。

class Person(object):
    def __init__(self,name):
        self.name=name
        
p1=Person('Jack')
p2=Person('Jack')
p3=p1

print(p1 is p2)   #False
print(pi is p3)   #True 

  2、isinstance

       isinstance内置函数,用来判断一个实例对象是否是由某一个类(或者子类)实例化创建出来的。

class Person:
    def __init__(self,name,age):
        self.name=name
        self.age=age
        
class Student(Person):
    def __init__(self,name,age,score):
        super(Student,self).__init__(name,age)   #继承父类的name,age初始化
        self.score=scroe
        
class Dog:
    def __init__(self,name,color):
        self.name=name
        self.color=color
        
p=Person('Jack',18)
s=Student('Rose',20,98)
d=Dog('mimi','white')

print(isinstance(p,Person))    #True   对象p是由Person类创建出来的
print(isinstance(s,Person))    #True   对象s是由Person类的子类创建出来的
print(isinstance(d,Person))    #True   对象d和Person类没有关系

  3、issubclass

       issubclass用来判断两个类之间的继承关系。
class Person:
    def __init__(self,name,age):
        self.name=name
        self.age=age
        
class Student(Person):
    def __init__(self,name,age,score):
        super(Student,self).__init__(name,age)   #继承父类的name,age初始化
        self.score=scroe
        
class Dog:
    def __init__(self,name,color):
        self.name=name
        self.color=color

print(issubclass(Student,Person))    #True 
print(issubclass(Dog,Person))    #False

  

三、单例

        __new__ 和 __init__方法

class A:
    def __init__(self):
        print('这是init方法')
        
    def __new__(cls):
        print('这是new方法')
        return object.__new__(cls)
        
A()

  总结:

       1、__new__至少需要一个参数cls,代表要实例化的类,此参数在实例化时由python解释器自动提供

       2、__new__必须要有返回值,返回实例化出来的实例,这点在自己实现__new__时要特别注意,可以return父类__new__出来的实例,或者直接是object的__new__出来的实例

       3、__init__有一个参数self,就是这个__new__返回的实例,__init__在__new__的基础上可以完成其它初始化的动作,__init__不需要返回值

 

单例

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

    @classmethod
    def __new__(cls, *args, **kwargs):
        if cls.__instance is None:
            #申请内存,创建一个对象,并把对象的类型设置成cls
            cls.__instance=object.__new__(cls)
        return cls.__instance

    def __init__(self,a,b):
        if self.__is_first:    #保留第一次初始化数据
            self.a=a
            self.b=b
            self.__is_first=False

s1=Singleton('hello','world')
s2=Singleton('you','welcome')

print(s1.a, s2.a, s1.b, s2.b)    #hello hello world world

  

四、新式类和经典类

       新式类:继承自object的类我们称之为新式类

       经典类:不继承自object的类
 
在python2里,如果不手动的制定一个父类是object,这个类就是一个经典类。

在python3里,不手动制定父类object,也是默认继承自object,在python中都是新式类。

 
在python2里,继承自object,意味着有更多的内置函数和方法可调用。
 

posted @ 2021-02-26 11:56  wangshanglinju  阅读(111)  评论(0编辑  收藏  举报