python面向对象进阶
@property
-
@property是python内置的一个装饰器,作用是将一个方法变成属性
-
作用:使得对属性的访问既安全又便捷
-
安全:被@property修饰的方法若没有setter方法,属性无法被修改,setter方法也可以设置筛选条件,避免实例直接修改属性
-
便捷:被@property修饰的方法可以像实例使用属性一样直接调用,不需要(),ege :
class Dog(): def __init__(self, name): sele.name = name @property def name(self): return sele.name dog = Dog("大黄") print(dog.name)
-
-
setter方法
- 语法格式:
@{methodname}.setter
@name.setter def name(self, name): self.name = namedelter
- 语法格式:
-
deleter方法
- 语法格式:
@{methodname}.delete
@name.deleter def name(self): del self.name
- 语法格式:
-
总结:这些只是最基础的用法,方法体中可以写更多语句,来实现对应的目标
@staticmethod
将方法转换为静态方法,静态方法属于类而不属于对象,在调用这个方法时不需要对象.
-
语法
class C: @staticmethod def f(arg1, arg2, argN): ...
静态方法既可以由类中调用(如 C.f()
),也可以由实例中调用(如 `C().f()
)。此外,还可以作为普通的函数进行调用(如 f()
)。
@classmethod
与静态方法类似,类方法的第一个参数约定名为cls,它代表的是当前类相关的信息的对象,通过这个参数我们可以获取和类相关的信息并且可以创建出类的对象
-
语法
class C: @classmethod def f(cls, arg1, arg2): ...
类方法的调用可以在类上进行 (例如 C.f()
) 也可以在实例上进行 (例如 C().f()
)。 其所属类以外的类实例会被忽略。 如果类方法在其所属类的派生类上调用,则该派生类对象会被作为隐含的第一个参数被传入。
魔法方法
__slots__
需要限定自定义类型的对象只能绑定某些属性,可以通过在类中定义__slots__变量来进行限定。需要注意的是__slots__的限定只对当前类的对象生效,对子类并不起任何作用。
class Father():
__slots__ = "name", "age", "gender"
def __init__(self, name, age, gender):
self.name = name
self.age = age
self.gender = gender
def play(self):
print(f"{self.name}正在玩")
class Son(Father):
def __init__(self, school, name, age, gender):
super().__init__(name, age, gender)
self.school = school
if __name__ == '__main__':
f = Father("老王", "38", "男")
# f.school = "大头小学"
# 'Father' object has no attribute 'school'
s = Son("小王", "18", "男", "北大")
s.love = "girl"
# print(f.school)
# 子类属性添加成功
print(s.love)
多重继承
一个子类继承多个父类,可以避免设计太多层次的复杂继承关系,但是会被"类的整体层次"搞得异常复杂
语法 class(c1, c2, c3...)
-
MRO方法解析顺序
如果父类中有相同的方法名,在子类没有指定父类方法名时,解释器将"从左到右"按顺序搜索执行,可以通过
方法获取"类的层次结构",方法解释顺序也按此执行mro()
-
super()方法
简单理解为重载指定"父类"的方法,实际上super的调用是遵循Python的【MRO(方法解析顺序)】来执行的
class A:
def test(self):
print('A')
class B:
def test(self):
print('B')
class C(A, B): # mro排序为, , 调用B类中的test方法
if __name__ == '__main__':
c = C()
print(C.__mro__)
# 输出结果为
# A
# A
# B