并且多个实例对象之间共享同一个类属性,在类定义的时候只定义一次
#encoding=utf-8 #多继承的特点 class Base(object): def test(self): print("----base") class A(Base): def test(self): print("-----A") class B(Base): def test(self): print("----B") class C(Base): def test(self): pass class D(A,B): def test(self): print("----D") class E(A,C): def test(self): pass e=E() e.test() print(E.__mro__) #类名.__mro__:根据C3算法计算到的,显示继承的顺序E-A-C-Base,决定了调用一个方法时,搜索父类的顺序 #如果在某个类中找到了方法,那么久停止搜索 #多态的概念:定义时的类型和运行的类型不一样,此时就成了多态 #python语言是动态的 #是弱类型语言,定义变量的时候不需要定义变量的类型 class Attribute: num=0 #这里定义了一个类的属性,类属性 def __init__(self,new_name):#实例方法 self.name=new_name #这里一个定义了一个属性,直接赋值,实例属性 Attribute.num+=1 #对类属性进行操作 @classmethod def add_num(cls):#定义一个类方法 cls表示类,代表类,可以换个名字 cls.num=100 #改变类属性 @staticmethod def printSome(): print("can print something") a1=Attribute('property') a1.add_num() #可以通过类的名字调用此方法,也可以通过类创建的对象调用此方法 Attribute.add_num() #调用静态方法,可以完成一个类方法和实例方法之外的简单工作 Attribute.printSome() #通过类名调用此方法 a1.printSome() #通过类对象调用此方法,都可行 #这里有个特点,实例方法参数写(self),类方法写@classmethod,参数(cls) #x写@staticmethod,可以没有任何参数 #Attribute是一个类对象,创建的话会创建一个实例对象 #实例属性:和具体的某个实例对象有关系 #并且一个实例对象和另外一个实例对象是不共享属性的 #类属性:类属性所属于类对象 #并且多个实例对象之间共享同一个类属性,在类定义的时候只定义一次 #实例方法、类方法、静态方法 __new__()方法:完成了创建,__init__()完成了初始化 #encoding=utf-8 #工厂方法模式 #__new__方法:__new__至少有一个参数cls,代表要实例化的类,此参数在实例化时由python解释器自动提供 #__new__方法必须有返回值,返回实例化出来的实例 #__init__有一个参数self,就是这个__new__返回的实例,__init__在__new__的基础上可以完成一些 #其他初始化的动作,__init__不需要返回值 #可以将类比作制造商,__new__方法就是前期的原材料购买环节,__init__方法就是在有原材料的基础上,加工,初始化商品环节 #复习一下学过的__开头的方法 class Teacher(object): """docstring for Teacher""" def __init__(self): self.arg = 1 def __del__(self): print("将对象删除后执行的操作") def __str__(self): print("打印对象时执行的操作") def __new__(cls):#这里有参数,把类当作参数传输 print("执行new方法") tea=Teacher() #这时候调用了一个方法,__new__ #运行结果:执行new方法 #1 创建一个对象;2 调用__init__()方法 3返回对象的引用 #之前在没有写new方法是时候,自动调用父类的object类的__new__()方法,现在上面例子是重写了__new__()方法,只是完成了打印功能,并没有实现创建对象 # class Student(object): """docstring for Student""" def __init__(self): self.arg = 1 def __del__(self): print("将对象删除后执行的操作") def __str__(self): print("打印对象时执行的操作") def __new__(cls):#这里有参数,把类当作参数传输 print("执行new方法") object.__new__(cls)#仍然调用父类的__new__方法,这里的cls是要创建的对象的类 print("调用父类执行new方法") stu=Student()#1 调用__new__方法来创建对象 2 调用__init__,刚创建的对象是参数self 3 返回对象的引用 #像C++中的构造函数:完成了创建和初始化,在python中分成了两个方法,分别完成创建__new__和初始化__init__ '''显示的内容: 执行new方法 将对象删除后执行的操作 调用父类执行new方法 ''' 创建单例模式 #encoding=utf-8 #创建一个单例模式,即,始终打开的都是一个,若已创建则不再创建 class StudentA(object): __instance=None#私有属性,此类内部可以访问 def __new__(cls): if cls.__instance==None: cls.__instance=object.__new__(cls) return cls.__instance else: return cls.__instance stu=StudentA() 只能初始化一次 #encoding=utf-8 #创建一个单例模式,即,始终打开的都是一个,若已创建则不再创建 class StudentA(object): __instance=None#私有属性,此类内部可以访问 def __new__(cls,name):#因为__init__有参数,所以这里也需要给定参数 if cls.__instance==None: cls.__instance=object.__new__(cls) return cls.__instance else: return cls.__instance def __init__(self,name): self.name=name stu=StudentA("hummy")#这种方法在__new__方法中进行了限定,只开一个单例模式,但是初始化的时候则会每次创建都会初始化 print(id(stu)) print(stu.name) stud=StudentA("bohy") print(id(stud)) print(stud.name) '''显示结果 18468592 hummy 18468592 bohy ''' class StudentB(object): __instance=None#私有属性,此类内部可以访问 __initFlag=False def __new__(cls,name):#因为__init__有参数,所以这里也需要给定参数 if cls.__instance==None: cls.__instance=object.__new__(cls) return cls.__instance else: return cls.__instance def __init__(self,name): if StudentB.__initFlag==False: StudentB.__initFlag=True self.name=name stu=StudentB("hummy")#这种方法在__new__方法中进行了限定,只开一个单例模式,但是初始化的时候则会每次创建都会初始化 print(id(stu)) print(stu.name) stud=StudentB("bohy") print(id(stud)) print(stud.name) '''显示的结果 18477128 hummy 18477128 hummy '''