python 面向对象编程

1 类定义

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
26
class Rectangle:

def __init__(self, width = 20, height = 10):
# 设置实例变量self.width来存储传入的宽度参数
self.width = width
# 设置实例变量self.height来存储传入的高度参数
self.height = height

def circumference(self):
"""返回矩形的周长

计算公式为2*(宽度 + 高度)

"""
return 2 * (self.width + self.height)

def area(self):
"""计算矩形的面积(desc)

计算公式为宽度 * 高度

"""
return self.width * self.height

# 定义对象
rect = Rectangle(10, 20)

1.1 装饰器

在Python 中,装饰器 (decorator) 是一种特殊的语法,用于在不修改函数代码的情况下,为函数添加额外的功能修改函数的行为

  1. @property 将方法转换为只读属性,使之可以不用 () 号,直接使用;
  2. @xx.setter 设置属性时执行一些逻辑或验证
  3. @classmethod 装饰器用于定义类方法
使用装饰器定义 python 类的示例
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
26
27
28
29
class ListStatistics:

def __init__(self):
self._data = []

@property # @property 将方法转换为只读属性
def data(self):
return self._data

@data.setter # setter 设置属性时执行一些逻辑或验证
def data(self, new_list):
if self._are_all_numeric(new_list):
self._data = new_list
else:
print("错误:列表中元素必须全部是数值")

@classmethod # @classmethod 装饰器用于定义类方法
def _are_all_numeric(cls, input_list):
for element in input_list:
if not isinstance(element, (int, float)):
return False
return True

# 创建一个浮点数列表
data = [8.8, 1.8, 7.8, 3.8, 2.8, 5.6, '3.9', 6.9]
# 创建实例
float_list_obj = ListStatistics()
# 尝试设置含非数值元素的列表,会输出错误消息
float_list_obj.data = data

2 继承

继承示例
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
26
27
28
29
30
31
32
33
# 父类,动物
class Animal:
def __init__(self, name, age):
self.name = name
self.age = age
def eat(self):
print(f"{self.name} is eating.")
def sleep(self):
print(f"{self.name} is sleeping.")

# 子类,鸡
class Chicken(Animal):
def __init__(self, name, age, color):
super().__init__(name, age)
self.color = color
def lay_egg(self):
print(f"{self.name} is laying an egg.")

# 子类,兔
class Rabbit(Animal):
def __init__(self, name, age, speed):
super().__init__(name, age)
self.speed = speed
def jump(self):
print(f"{self.name} is jumping.")

chicken1 = Chicken("chicken1", 1, "white")
chicken1.eat();
chicken1.lay_egg()

rabbit1 = Rabbit("rabbit1", 2, 10)
rabbit1.sleep();
rabbit1.jump()