Python面向对象之进阶
一、property 内置函数
装饰器的使用:所有的装饰器函数、方法、类的上一行直接@装饰器的名字
装饰器的分类:
① 装饰函数
② 装饰方法
③ 装饰类
property 是一个装饰器函数
@property 是装饰方法的,将一个方法伪装成一个属性,相当于调用方法是不需要加括号
class A:
def __init__(self,name):
self.__name = name
@property
def name(self):
return self.__name
a = A('小明')
print(a.name)
'''
小明
'''
方法不能被删除,属性可以删除
property的作用:
一个方法被伪装成属性之后,应该可以执行一个属性的增删改查操作,所有的操作方法必须更property修饰的同名
增加和修改属性:使用setter装饰的方法,这个方法需要一个必传入的参数,用于私有变量的赋值
删除属性:使用delete装饰的方法,这个方法并不是在执行是删除属性,而是del 属性的时候执行方法里的代码
class School:
def __init__(self,name):
self.__name = name # 定义私有属性
@property # 把方法装饰为属性
def name(self):
return self.__name
@name.setter # 设置属性修改的方法,修改属性的值
def name(self,new_name):
self.__name = new_name
@name.deleter # 设置删除属性执行的方法
def name(self):
print('不能删除啊!')
harvard = School('哈佛')
print(harvard.name) # 获取属性的值
print(harvard.__dict__) # 获取对象的所有方法和属性
harvard.name = '北大' # 修改属性的值
print(harvard.__dict__)
del harvard.name # 执行被deleter的方法
print(harvard.__dict__)
'''
哈佛
{'_School__name': '哈佛'}
{'_School__name': '北大'}
不能删除啊!
{'_School__name': '北大'}
'''
二、@classmethod
classmethod 修饰符对应的函数不需要实例化,不需要 self 参数,但第一个参数需要是表示自身类的 cls 参数,可以来调用类的属性,类的方法,实例化对象等
类方法的特点:
使用类中的资源,而且这个资源可以直接用类名引用的使用,那这个方法就应该被改为一个类方法。
类方法使用@classmethod 来修饰,类方法不涉及类对象的资源。
class England:
__city = 'London'
def __init__(self):
pass
@classmethod # 使用类修改本类的静态属性
def change_capital(cls,city): # cls是类,类方法
England.__city = city
print(England._England__city)
England.change_capital('Liverpool')
print(England._England__city)
'''
London
Liverpool
'''
三、@staticmethod
staticmethod 返回函数的静态方法。
当一个在类中的普通方法不需要传入类和类对象,可以使用staticmethod修饰
class A:
@staticmethod
def func():
print('静态方法')
A.func()
四、类的补充
类包含的内容:
① 静态属性
调用者:类
特点:所有的对象都统一拥有的属性
② 类方法
调用者:类
特点:方法涉及到操作静态属性、类方法、静态方法
形参:cls 表示类
③ 静态方法
调用者:类
特点:普通方法,不使用类中的命名空间也不适用对象的命名空间,相当于一个普通的函数,没有默认参数
④ 方法
调用者:对象
形参:self 表示对象
⑤ property方法
调用者:对象
形参:self 表示对象
五、isinstance
检测对象与类的关系
isinstance() 与 tpye() 的区别:
type不接收继承关系,isinstance接收继承关系
type只能判断这个对象是哪个类创建出来的,isinstance能判断对象与类之间的继承关系
type相对精确,isinstance覆盖面广
class A:pass
class B(A):pass
a = A()
b = B()
print(type(b) is B)
print(type(b) is A)
print('---------------')
print(isinstance(b,B))
print(isinstance(b,A))
'''
True
False
---------------
True
True
'''
六、issubclass
检测类与类之间的关系,判断cls是否为cls的父类
使用:issubclass(子类,父类 )
class A:pass
class B(A):pass
print(issubclass(A,B))
print(issubclass(B,A)) # 子类放在第一个参数
'''
False
True
'''