Python类属性和类方法以及单例设计模式

本文详细介绍了Python中的类属性、实例属性、类方法和静态方法,包括它们的概念、使用方式以及访问机制。同时,文章还探讨了单例设计模式,解释了其目的和Python中实现单例的技巧,包括`__new__`方法的使用。
摘要由CSDN通过智能技术生成

类属性和类方法

目标

  • 类的结构
  • 类属性和实例属性
  • 类方法和静态方法

1. 类的结构


1.1 术语–实例

  • 在面向对象开发过程中,第一步就是需要设计
  • 第二步,使用 类名() 创建对象,创建对象分为两步:
    1. 在内存中为对象 分配空间;
    2. 调用初始化方法 __init__ 为对象初始化。
  • 对象创建后,内存 中就有了一个对象的 实实在在 的存在 —— 实例
    类实例化
    因此,通常也会把:
    1. 创造出来的 对象 叫做 实例
    2. 创作对象的 动作 叫做 实例化
    3. 对象的 属性 叫做 实例属性
    4. 对象的 方法 叫做 实例方法

在程序执行时:

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

结论

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

1.2 类是一个特殊的对象

Python 中的一切都是对象:

  • class AAA(object) :定义的类属于类对象。
  • object_one = AAA(): 这个是实例对象。

注意:

  • 在程序运行时,类 同样 会被加载到内存
  • 在程序运行时,类对象 在内存中 只有一份,使用 一个类 可以创建出 很多个对象实例
  • 除了封装 实例 的 属性 和 方法外,类对象 还可以拥有自己的 属性 和 方法:
    1. 类属性
    2. 类方法
  • 通过 类名. 的方式可以 访问 类的属性 或者 调用类的方法
    类详解

2. 类属性和实例属性


2.1 概念和使用

  • 类属性 就是给 类对象 中定义的 属性,通常用来记录 与这个类相关 的特征
  • 类属性 不会用于记录 具体对象的特征

示例需求

  • 定义一个 动物类
  • 每种动物都有自己的 name
  • 需求——知道使用这个类,创建了多少种动物?
    动物类
class Animals(object):

    # 使用赋值语句,定义类属性,记录创建动物对象的总数
    count = 0

    def __init__(self, name):
        self.name = name

        # 针对类属性做一个计数
        Animals.count += 1


# 创建动物类
dog = Animals('狗')
cat = Animals('猫')
snake = Animals('蛇')

# 知道使用 Animals 类到底创建了多少个对象?
print('现在创建了 %d 个对象' % Animals.count)
# 这里也可以使用 对象.类属性 打印对象个数,但是不推荐,下文进行讲解

结果输出:

现在创建了 3 个对象

2.2 属性的获取机制

  • Python 中,属性的获取 存在一个 向上查找机制
    向上寻找机制
  • 因此,要访问类属性有两种方式:
    • 类名.类属性
    • 对象.类属性 (不推荐)

注意

  • 如果使用 对象.类属性 = 值 赋值语句,只会 给对象添加一个属性,而不会影响到 类属性的值。

2.3 类方法和静态

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: 在Python中,可以使用模块来实现单例设计模式。因为模块在第一次导入时会生成.pyc文件,当第二次导入时会直接加载.pyc文件,而不会再次执行模块代码。所以,我们只需要把相关的函数和数据定义在一个模块中,就可以获得一个单例对象了。\[1\] 另外,我们也可以通过在的__new__方法中实现单例模式。在__new__方法中,我们可以控制对象的创建过程,确保只有一个实例被创建。可以使用线程锁来保证在多线程环境下的线程安全性。\[3\] 以下是一个使用共享属性版本实现的单例模式的示例代码: ```python # s1.py class Singleton(object): def __new__(cls, *args, **kwargs): if not hasattr(cls, "_instance"): cls._instance = super().__new__(cls, *args, **kwargs) return cls._instance # s2.py from s1 import Singleton a = Singleton() b = Singleton() print(id(a)) # 输出相同的id print(id(b)) # 输出相同的id ``` 这样,无论创建多少个Singleton的实例,都会得到同一个实例对象。\[2\] #### 引用[.reference_title] - *1* *3* [Python中的单例模式的几种实现方式的及优化](https://blog.csdn.net/aobian2884/article/details/101404352)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Python 单例模式](https://blog.csdn.net/hj1993/article/details/129209110)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值