python面向对象<三>
类属性、实例属性:
class Tool(object): #属性(类属性)类对象(Tool) num = 0 #方法 def __init__(self,new_name): self.name = new_name #实例属性 Tool.num += 1 #(类属性的引用方法) tool1 = Tool('铁锹') tool2 = Tool('工兵铲') tool3 = Tool('水桶')
实例属性:
和具体的某个实例对象有关系
并且一个实例对象和另一个实例对象是不共享属性的
类属性:
类属性所属于类对象
并且多个实例对象之间共享同一个类属性
类方法、实例方法、静态方法:
class Game(object): #类属性 num = 1 #实例方法:必须要有一个参数,参数用来接触对象(self) def __init__(self): #实例属性 self.name = 'laowang' #类方法:必须要有一个参数 ,参数进行类的引用 @classmethod def add_num(cls): #cls:保存类的引用(修改类属性) cls.num = 100 # 静态方法:可以没有任何参数 @staticmethod def print_menu(): print('---------------') print('穿越火线') print('1、开始游戏') print('2、结束游戏') print('---------------') #调用类方法 game = Game() # Game.add_num() #1、调用类方法#可以通过类的名字调用类方法 game = Game() #2、还可以通过这个类创建出来的对象去调用这个类方法 print(Game.num) #调用静态方法 #Game.print_menu() #1、通过类调用静态方法 game.print_menu() #2、通过实例对象去调用静态方法
__new__方法:
class Dog(object): def __init__(self): print('-------init方法------') def __del__(self): print('-------del方法------') def __str__(self): print('-------str方法------') def __new__(cls): # cls时Dog指向的那个对象 # print(id(cls)) print('-------NEW方法------') return object.__new__(cls) # 重新调用object类的new方法 # print(id(Dog)) xtq = Dog()
相当于要做3件事
1、调用__new__方法只来创建对象,然后找一个变量来接受__new__的返回值,这个返回值表示创建出来的对象的引用
2、__init__(刚刚创建出来的对象的应用),__init__只负责初始化
3、返回对象的引用
总结:
· _new__至少要有一个参数cls,代表要实例化的类。
· __new__必须要有返回值,返回实例化出来的实例。
· __init__在__new__的基础上可以完成一些其它初始化的动作,__init__不需要返回值
单例:
1. 单例是什么
举个常见的单例模式例子,我们日常使用的电脑上都有一个回收站,在整个操作系统中,回收站只能有一个实例,整个系统都使用这个唯一的实例,而且回收站自行提供自己的实例。因此回收站是单例模式的应用。
确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,单例模式是一种对象创建型模式。
单例:不管创建多少此,都是一个对象。eg:window
class Dog(object): __instance = None #为了不影响外边,设置成私有属性 def __new__(cls): if cls.__instance == None: cls.__instance = object.__new__(cls) return cls.__instance else: #return上一次创建对象的引用 return cls.__instance a = Dog() print(id(a)) b = Dog() print(id(b)) # >>> 1736945052248 # >>> 1736945052248
单例一次
class Dog(object): __instance = None #为了不影响外边,设置成私有属性 def __new__(cls,name): if cls.__instance == None: cls.__instance = object.__new__(cls) return cls.__instance else: #return上一次创建对象的引用 return cls.__instance def __init__(self,name): self.name = name a = Dog('旺财') print(id(a)) print(a.name) b = Dog('哮天犬') print(id(b)) print(b.name) # >>> 2605269461816 # >>> 旺财 # >>> 2605269461816 # >>> 哮天犬
只初始化一次:
#单例:不管创建多少此,都是一个对象。eg:window class Dog(object): __instance = None #为了不影响外边,设置成私有属性 __init_flag = False def __new__(cls,name): if cls.__instance == None: cls.__instance = object.__new__(cls) return cls.__instance else: #return上一次创建对象的引用 return cls.__instance def __init__(self,name): if Dog.__init_flag == False: self.name = name Dog.__init_flag = True a = Dog('旺财') print(id(a)) print(a.name) b = Dog('哮天犬') print(id(b)) print(b.name) # >>> 2605269461816 # >>> 旺财 # >>> 2605269461816 # >>> 旺财
作者:无荨
-------------------------------------------
个性签名:学IT,就要做到‘活到老学到老’!
如果觉得这篇文章对你有小小的帮助的话,别忘记点个“推荐”哦!