Python面向对象的补充

2022-08-11 11:05:23

一、类的结构

术语–实例
1.使用面向对象开发,第一步是设计类
2.使用 类名() 创建对象,创建对象的动作有两步
1.在内存中为对象分配空间
2.调用初始化方法__init___ 为对象初始化
3.对象创建后,内存中就有了一个对象的实实在在的存在–实例

因此:
1.创建出来的对象叫做类的实例
2.创建对象的动作叫做实例化
3.对象的属性叫做实例属性
4.对象调用的方法叫做实例方法

在程序执行时:
1.对象各自拥有自己的实例属性
2.调用对象的方法,可以通过self
访问自己的属性
调用自己的方法

结论:
1.每一个对象都有自己独立的内存空间,保存各自不同的属性
2.多个对象的方法,在内存中之有一份,在调用方法时,需要把对象的引用传递到方法内部

二、静态方法:

在开发中,如果需要在一个类中封装一个方法 这个方法
既不需要访问实例属性或者调用实例方法
也不需要访问类属性或者调用类方法
这个时候,我们就可以把这个方法封装成一个静态方法

class Cat(object):
    @staticmethod
    def call():
        print('喵喵~')
# 通过 类名. 调用静态方法
Cat.call()  
# 不需要创建对象,直接就可以使用

结果:
喵喵~

三、私有属性和私有方法

应用场景及定义方式

应用场景
在实际开发中,对象的某些属性或方法可能只希望在对象的内部使用,
而不希望在外部被访问到
私有属性 就是 对象 不希望公开的 属性
私有方法 就是 对象 不希望公开的 方法

定义方法
在定义属性或方法时,在属性名或者方法名前增加两个下划线,
定义的就是私有属性或方法

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解释器得不到分配了空间的对象引用
# 就不会调用对象的初始化方法

五、关于类的补充

类方法: 针对类对象定义的方法 在类方法内部可以直接访问类属性或者调员工其他的类方法

类属性: 针对类对象定义的属性 使用赋值语句在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
  • 作者:就叫玉生烟
  • 原文链接:https://blog.csdn.net/qq_44224894/article/details/89166419
    更新时间:2022-08-11 11:05:23