09-Python之路-进阶-面向对象-类与方法
2022-04-28 本文已影响0人
程序记录日志
类属性
- 类属性就是给类对象中定义的属性,通常用来记录与这个类相关的特征
- 类属性不会记录具体对象的特征
属性的获取机制
- 在Python中属性的获取存在一个向上查找机制。因此,要访问类属性有两种方式:(类名、类属性),(对象、类属性)
- 向上查找机制:获取对象属性时,首先在对象内部查找对象属性,没有找到就会向上寻找类属性
- 如果使用
对象.类属性 = 值
赋值语句,只会给对象添加一个属性,而不会影响到类属性的值
类方法
- 类方法就是针对类对象定义的方法,在类方法内部可以直接访问类属性或调用其他的类方法
语法
@classmethod
def 类方法名(cls):
pass
- 类方法需要使用修饰器
@classmethod
来标识,告诉解释器这是一个类方法。 - 类方法第一个参数应该是
cls
。由哪个类调用的方法,方法内的cls就是哪一个类的引用。 - 类方法参数和self类似,通过
类名.
调用类方法,调用方法时,不需要传递cls参数。在方法内部可以通过cls.
访问类的属性,也可以通过cls.
调用其他的类方法
扩展
静态方法
- 当 类中某个方法即不需要访问实例属性或者调用实例方法也不需要访问类属性,或者调用类方法的时候可以把这个方法封装成一个静态方法
- 静态方法需要用修饰器
@staticmethod
来标识,告诉解释器这是一个静态的方法。通过类名.
调用静态方法
语法
@staticmethod
def 静态方法名():
pass
- 实例方法:由对象调用;至少一个self参数;执行实例方法时,自动调用该方法的对象赋值给self
- 类方法:由类调用;至少一个cls参数;执行类方法时,自动将调用该方法的类赋值给cls
- 静态方法:由类调用,无默认参数
- 相同点:对于所有的方法而言,均属于类,所以在内存中也只保存一份
- 不同点:方法调用者不同、调用方法时自动传入参数不同
单例
单例设计模式
- 目的:让类创建的对象,在系统中只有唯一的一个实例,每一次执行
类名()
返回的对象,内存地址是相同的
new方法
- 使用
类名()
创建对象时,Python会先调用new方法为对象分配空间 - 重写
__new__
方法要return super().__new__(cls)
,否则Python的解释器得不到分配空间的对象引用,就不会调用对象的初始化方法
作用
- 在内存中为对象分配空间
- 返回对象的引用
实例
- 定义一个类属性,初始值是None,用于记录单例对象的引用
- 重写new方法
- 如果类属性is None,调用父类方法分配空间,并在类属性中记录结果
- 返回类属性中记录的对象引用
class Singleton(object):
# 定义类属性记录单例对象引用
instance = None
def __new__(cls,*args,**kwargs):
# 1.判断类属性是否已经被赋值
if cls.instance is None:
cls.instance = super().__new__(cls)
# 2.返回类属性的单例引用
return cls.instance
- 定义一个类属性init_flag标记是否执行过初始化动作,初始值为False
- 在init方法中,判断init_flag,如果为False就执行初始化动作
- 然后将init_flag设置为True
- 再次自动调用init方法时,初始化动作就不会再次执行
class Singleton(object):
# 记录第一个被创建对象的引用
instance = None
# 记录是否执行过初始化操作
init_flag = False
def __new__(cls,*args,**kwargs):
# 1.判断类属性是否是空对象
if cls.instance in None:
# 2.调用父类的方法,为第一个对象分配空间
cls.instance = super().__new__(cls)
# 3.返回类属性保存的对象引用
return cls.instance
def __init__(self):
if not Singleton.init_flag:
print("初始化单例")
Singleton.init_flag = True
# 创建多个对象
singleton1 = Singleton()
print(singleton1)
singleton2 = Singleton()
print(singleton2)
property属性
定义
- 一种用起来像是使用的实例属性一样的特殊属性。property属性内部进行一系列的逻辑计算,最终将计算结果返回
注意
- 定义时,在实例方法的基础上添加@property装饰器一个,并且只有一个self参数
- 调用时,无需括号
方法:foo_obj.func()
property属性:foo_obj.prop
两种方式
- 装饰器:在方法上应用装饰器
- 类属性:在类中定义值为property对象的类属性
类属性访问方式
三种类属性访问方式
- @property:获取
- @proerty.setter:修改
- @property.deleter:删除
参数(property四个参数)
- 第一个参数:方法名,调用对象属性时,自动触发执行方法
- 第二个参数:方法名,调用对象属性 = XXX时,自动触发执行方法
- 第三个参数:方法名,调用del对象属性时,自动触发执行方法
- 第三个参数:字符串,调用对象属性
.__doc__
,此参数用来描述该属性信息
魔法属性
-
__init__
:初始化方法,通过类创建对象时,自动触发执行 -
__doc__
:表示类的描述信息` -
__module__
:表示当前操作的对象在哪个模块 -
__class__
:表示当前操作的对象的类是什么 -
__del__
:当对象在内存中被释放时,自动触发执行 -
__call__
:对象后面加括号,触发执行 -
__dict__
:类或对象中的所有属性(类的实例属性属于对象,类中的类属性和方法属于类) -
__str__
:如果一个类中定义了str方法,那么在打印对象时,默认输出该方法的返回值 -
__getitem__
、__setitem__
、__delitem__
:用于索引操作 -
__getslice__
、__setslice__
、__delslice__
:用于切片操作