python中类方法、静态方法、私有属性和私有方法

一、类方法

  • 类方法:针对类对象定义的方法 在类方法内部可以直接访问类属性或者调员工其他的类方法
  • 类属性:针对类对象定义的属性 使用赋值语句在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解释器得不到分配了空间的对象引用
 就不会调用对象的初始化方法

猜你喜欢

转载自blog.csdn.net/qq_44236589/article/details/89163795