面向对象进阶

_slots_魔术

由于python是一门动态语言[1],所以我们可以使用_slots_魔术限定,就是只能邦定

1
2
3
4
5
6
7
8
class Person:
# 限定Person对象只能绑定_name, __age和__sex属性
_slots_ = ("__name", "__age", "__sex")

def __init__(self, name, age, sex) -> None: # 后置返回值
self.__name = name
self.__age = age
self.__sex = sex

静态方法和类方法

静态方法

通过直接在类里面def 的方式结果都是类方法,下面是如何创建一个静态方法

1
2
3
4
5
6
7
8
9
10
11
class Student(Person):
def __init__(self, name, age, sex, school) -> None:
super().__init__(name, age, sex) # 调用父类的构造函数
self.__school = school

def get_name(self):
return super.__name

@staticmethod # 静态方法
def get_age():
return super.__age

类方法

类方法代表了与类本身信息相关的函数,第一个参数规定了是cls

1
2
3
@classmethod  # 类方法
def getClassName(cls):
return cls.__name__

类之间的关系

  • is-a关系也叫继承或泛化,比如学生和人的关系、手机和电子产品的关系都属于继承关系。
  • has-a关系通常称之为关联,比如部门和员工的关系,汽车和引擎的关系都属于关联关系;关联关系如果是整体和部分的关联,那么我们称之为聚合关系;如果整体进一步负责了部分的生命周期(整体和部分是不可分割的,同时同在也同时消亡),那么这种就是最强的关联关系,我们称之为合成关系。
  • use-a关系通常称之为依赖,比如司机有一个驾驶的行为(方法),其中(的参数)使用到了汽车,那么司机和汽车的关系就是依赖关系。

继承和多态

继承

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class Person:
# 限定Person对象只能绑定_name, __age和__sex属性
_slots_ = ("__name", "__age", "__sex")

def __init__(self, name, age, sex) -> None: # 后置返回值
self.__name = name
self.__age = age
self.__sex = sex


class Student(Person):
def __init__(self, name, age, sex, school) -> None:
super().__init__(name, age, sex) # 调用父类的构造函数
self.__school = school

def get_name(self):
return super.__name

@staticmethod # 静态方法
def get_age():
return super.__age

@classmethod # 类方法
def getClassName(cls):
return cls.__name__

多态

我们也可以对一个父类函数进行重写,当多个子类的调用同一个方法的结果不一样,这个就是多态

抽象类

一定要引入abc

1
2
3
4
5
6
7
8
9
10
11
12
13
import abc

# 注意构建的时候 metaclass=abc.ABCMeta
class Pet(object, metaclass=abc.ABCMeta):
"""宠物"""

def __init__(self, nickname):
self._nickname = nickname

@abc.abstractmethod
def make_voice(self):
"""发出声音"""
pass
  1. 允许我们在运行的时候,绑定新的方法和属性

面向对象进阶
https://tsy244.github.io/2023/10/17/python/面向对象进阶/
Author
August Rosenberg
Posted on
October 17, 2023
Licensed under