美文网首页
Python进阶——面向对象

Python进阶——面向对象

作者: 顾北向南 | 来源:发表于2019-06-28 21:21 被阅读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)获得是clsinstMRO列表中的下一个类。

7. 多继承

  • python2中的多继承函数调用顺序是深度优先调用,python3中是广度优先调用C3算法。
  • super().__init__相对于类名.init,在单继承上用法基本没有差别,但在多继承上,super方法能保证每个父类的方法只会执行一次,而使用类名的方法会导致方法被执行多次。
  • 多继承时,相对于使用类名.__init__方法,要把每个父类全部写一遍, 而使用super方法,只需写一句话便执行了全部父类的方法,这也是为何多继承需要全部传参的一个原因。

相关文章

网友评论

      本文标题:Python进阶——面向对象

      本文链接:https://www.haomeiwen.com/subject/ioqycctx.html