Python进阶——面向对象
2019-06-28 本文已影响0人
顾北向南
1. Python中的@property
@property是python自带的装饰器,装饰器(decorator)可以给函数动态加上功能。对于类的方法,装饰器一样起作用。Python内置的@property装饰器就是负责把一个方法变成属性调用的:
class Square(object):
def __init__(self):
self._width=10
self._height =10
@property
def width(self):
return self._width
@property
def height(self):
return self._height
> s =Square()
> print(s.width)
> s.width = 1024 # 会报错,这样可以保证属性的安全性
- 如果想要给width重新赋值,我们需要对该属性设置setter。
class Square(object):
def __init__(self):
self._width=10
self._height =10
@property
def width(self):
return self._width
@property
def height(self):
return self._height
@property.setter
def width(self,w):
slef._width = w
- 有了@property,我们在对实例属性操作的时候,就知道该属性很可能不是直接暴露的,而是通过getter和setter方法来实现的。
2. python中的slots魔法
Python是一门动态语言。动态语言允许我们在程序运行时给对象绑定新的属性和方法,当然也可以对已经绑定的属性和方法进行解绑。但是如果需要限定自定义类型的对象只能绑定某些属性,可以通过在类中定义__slots__
变量来进行限定。需要主要的是__slots__
的限定只对当前类的对象生效,多子类不起任何作用。
class Student:
# 限定Student对象只能绑定name,age
__slots__ = ('name','age')
3. 静态方法和类方法
- 两者都可以使用类或者实例调用
- 类方法的第一个参数必须是
class
本身cls
,静态方法无需传入任何参数
4. 类之间的关系
- 关联: 比如部门和员工的关系。关联关系如果是整体和部分的关联,那么我们称之为聚合关系;如果整体进一步负责了部分的生命周期那么这种就是最强的关联关系,我们称之为合成关系。
- 继承:比如学生和人之间的关系。
- 依赖:比如司机有一个驾驶的行为(方法),其中(的参数)使用到了汽车,那么司机和汽车的关系就是依赖关系。
5. 抽象方法
- python3中引入了
abc
模块,通过@abc.abstractmethod
可以更简洁地使用抽象类,抽象方法。
import abc
class Base(metaclass=abc.ABCMeta):
@abc.abstractmethod
def save(self):
pass
6. Super()
-
super
是一个类名而非函数,super(class,self)
事实上调用了super
类的初始化函数,产生了一个super
对象。 -
super()
机制必须用于新式类,否则会报错。 -
super()
或直接父类调用最好只选择一种形式。 -
super
和父类没有实质性的关系,super(cls,inst)
获得是cls
在inst
的MRO
列表中的下一个类。
7. 多继承
- python2中的多继承函数调用顺序是深度优先调用,python3中是广度优先调用C3算法。
-
super().__init__
相对于类名.init
,在单继承上用法基本没有差别,但在多继承上,super
方法能保证每个父类的方法只会执行一次,而使用类名的方法会导致方法被执行多次。 - 多继承时,相对于使用类名
.__init__
方法,要把每个父类全部写一遍, 而使用super
方法,只需写一句话便执行了全部父类的方法,这也是为何多继承需要全部传参的一个原因。