一、类方法
- 类方法:针对类对象定义的方法 在类方法内部可以直接访问类属性或者调员工其他的类方法
- 类属性:针对类对象定义的属性 使用赋值语句在class关键字下可以定义类属性
- 类属性用于记录与这个类相关的特性
class Toy(object):
# 1.使用赋值语句定义类属性,记录所有玩具的数量
count = 0
def __init__(self,name):
self.name = name
# 让类属性 +1
Toy.count += 1
@classmethod
def show_toy_count(cls):
print('玩具对象的数量 %d' %(cls.count))
# 创建玩具对象
toy1 = Toy('乐高')
#toy2 = Toy('泰迪熊')
# 调用类方法
Toy.show_toy_count()
结果为:玩具对象的数量 1
- 类的结构
术语–实例
1.使用面向对象开发,第一步是设计类
2.使用 类名() 创建对象,创建对象的动作有两步
1.在内存中为对象分配空间
2.调用初始化方法__init___ 为对象初始化
3.对象创建后,内存中就有了一个对象的实实在在的存在–实例
因此:
1.创建出来的对象叫做类的实例
2.创建对象的动作叫做实例化
3.对象的属性叫做实例属性
4.对象调用的方法叫做实例方法
在程序执行时:
1.对象各自拥有自己的实例属性
2.调用对象的方法,可以通过self
访问自己的属性
调用自己的方法 - 结论:
1.每一个对象都有自己独立的内存空间,保存各自不同的属性
2.多个对象的方法,在内存中之有一份,在调用方法时,需要把对象的引用传递到方法内部
二、静态方法
静态方法:
在开发中,如果需要在一个类中封装一个方法 这个方法
既不需要访问实例属性或者调用实例方法
也不需要访问类属性或者调用类方法
这个时候,我们就可以把这个方法封装成一个镜头方法
class Cat(object):
@staticmethod
def call():
print('喵喵~')
# 通过 类名. 调用静态方法
Cat.call()
# 不需要创建对象,直接就可以使用
三、私有属性和私有方法
- 应用场景及定义方式
1.应用场景
在实际开发中,对象的某些属性或方法可能只希望在对象的内部使用,
而不希望在外部被访问到
私有属性 就是 对象 不希望公开的 属性
私有方法 就是 对象 不希望公开的 方法
2.定义方法
在定义属性或方法时,在属性名或者方法名前增加两个下划线,
定义的就是私有属性或方法
class Women(object):
def __init__(self,name):
self.name = name
self.__age = 18
def __secrte(self):
print(self.__age)
lily = Women('lily')
print(lily.name)
#print(lily.__age)
lily.__secrte()
-
单例设计模式
-
设计模式
设计模式是前人工作的总结和提炼,通常,被人们广泛流传的设计模式都
是针对莫一特定问题的成熟解决方案
使用设计模式是为了可重用代码,让代码更容易被他人理解,保证代码可靠性 -
单例设计模式
目的:让类创建对象,在系统中只有唯一的一个实例
每一次执行类名()返回的对象,内存地址是相同的
怎么保证 这些对象只有一个?
__new__方法:
我们用 类名. 的方式创建对象的时候,python解释器会帮我们做两件事情,是哪两件事情呢?
1.为对象分配空间 2.对象初始化
使用类名()创建对象时,python的解释器首先会调用__new__方法为对象分配空间
__new__是一个由object基类提供的内置的静态方法,主要有两个作用:
在内存中为对象分配空间
返回对象的引用
python的解释器获得对象的引用后,将引用作为第一个参数,传递给__init__方法
#new:负责给对象分配空间 init(初始化方法)负责给对象初始化
我们要重写new方法,使用类名()创建对象的时候,返回的都是同一个地址
重写__new__方法的代码非常固定:
继承自父类方法
返回父类方法调用_new__方法的结果
重写__new__方法一定要return object.new(cls)
否则python的解释器得不到分配了空间的对象引用,就不会调用对象的初始化方法
class MusicPlayer(object):
instance = None
def __new__(cls, *args, **kwargs):
# 第一个参数cls:哪一个类调用就传递哪一个类
# 第二个参数*args:多值元组
# 第三个参数*kwargs:多值的字典
# 重写了object这个父类的方法
# print('创建对象,分配空间')
# # 1.创建对象时,new方法会被自动调用
# print('创建对象,分配空间')
# # 2.为对象分配空间
# # __new__方法是一个类方法,在调用的时候,第一个参数为cls
# instance = object.__new__(cls)
#
# # 3.返回对象的引用
# return instance
# 判断类属性是否是空对象
if cls.instance is None:
# 2.调用父类方法,为第一个对象分配空间
cls.instance = object.__new__(cls)
return cls.instance
创建播放器对象
player = MusicPlayer()
print(player)
player2 = MusicPlayer()
print(player2)
看到的结果是:python解释器得不到分配了空间的对象引用
就不会调用对象的初始化方法