zoukankan      html  css  js  c++  java
  • 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,意味着有更多的内置函数和方法可调用。
     

  • 相关阅读:
    bzoj2888: 资源运输
    [ SDOI 2009 ] HH的项链 & [ HEOI 2012 ] 采花
    [ POI 2017 ] Podzielno
    [ HAOI 2011 ] Problem A
    [ SDOI 2011 ] 打地鼠
    [ SCOI 2007 ] Perm
    [ POI 2011 ] Dynamite
    [ BZOJ 3038 & 3211 / SPOJ GSS4 ] 上帝造题七分钟2 / 花神游历各国
    [ BZOJ 3445 ] Roadblock
    [ ZJOI 2006 ] Mahjong
  • 原文地址:https://www.cnblogs.com/shixiaoxun/p/14451572.html
Copyright © 2011-2022 走看看