Pwner's Blog

能全力以赴不尽力而为

0%

Python 面向对象

Object Oriented Programming(OOP,即面向对象编程),与此相关的还有 OOD(面向对象的设计),OOA(面向对象的分析)。

Python 是面向对象的编程语言,在 Python 中,一切皆对象。

类定义

1
2
3
4
5
6
class ClassName:
<statement-1>
.
.
.
<statement-N>

类对象

类对象支持两种操作:

  • 属性引用
  • 实例化
1
2
3
4
5
6
7
8
9
10
11
12
13
class MyClass:
#类的属性
i = 12345
#类的方法
def f(self):
return 'hello world'

# 实例化类
x = MyClass()

# 访问类的属性和方法
print("MyClass 类的属性 i 为:", x.i)
print("MyClass 类的方法 f 输出为:", x.f())

输出结果为

1
2
MyClass 类的属性 i 为: 12345
MyClass 类的方法 f 输出为: hello world

若在类中定义了一个名为__init__() 的特殊方法(构造方法),该方法在类实例化时会自动调用。

1
2
3
4
5
6
7
8
9
10
11
12
13
class Washer():
#定义初始化功能函数
def __init__(self, width, height):
#添加实例属性
self.width = width
self.height = height
#类里面调用实例属性
def print_info(self):
print(f'洗衣机的宽度是{self.width}')
print(f'洗衣机的高度是{self.height}')

#创建一个对象的时候会默认调用类的__init__()方法,不需要手动调用
haier1 = Washer(10, 20)

其中,self 代表类实例,即调用该函数的对象,而非类。

类的方法与普通的函数只有一个特别的区别 —— 它们必须有一个额外的第一个参数名称 , 按照惯例它的名称是 selfself 不是 Python 的关键字,我们把他换成 pwner 也是可以正常执行的

1
2
3
4
5
6
7
class Test:
def prt(pwner):
print(pwner)
print(pwner.__class__)

t = Test()
t.prt()

执行结果:

1
2
<__main__.Test instance at 0x100771878>
__main__.Test

类的方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#类定义
class people:
#定义基本属性
name = ''
age = 0
#定义私有属性,私有属性在类外部无法直接进行访问
__weight = 0
#定义构造方法
def __init__(self,n,a,w):
self.name = n
self.age = a
self.__weight = w
def speak(self):
print("%s 说: 我 %d 岁。" %(self.name,self.age))

# 实例化类
p = people('pwner',10,30)
p.speak()

执行结果:

1
pwner 说: 我 10 岁。

类的魔法方法

在 Python 中, __xx__() 的函数叫做魔法方法,指的是具有特殊功能的函数。

__init__()

初始化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Washer():
#定义初始化功能函数
def __init__(self, width, height):
#添加实例属性
self.width = width
self.height = height
#类里面调用实例属性
def print_info(self):
print(f'洗衣机的宽度是{self.width}')
print(f'洗衣机的高度是{self.height}')

#创建一个对象的时候会默认调用类的__init__()方法,不需要手动调用
haier1 = Washer(10, 20)
#__init__(self)中的self参数不需要开发者传递,Python解释器会自动把当前的对象引用传递过去
haier1.print_info()

注意:

  • __init__() 方法,在创建⼀一个对象时默认被调⽤用,不不需要⼿手动调⽤
  • __init__(self) 中的 self 参数,不需要开发者传递,python 解释器器会自动把当前的对象引用传递过去。

带参数的__init__()

问:一个类可以创建多个对象,如何对不不同的对象设置不不同的初始化属性呢?

答:传参数。

1
2
3
4
5
6
7
8
9
10
11
12
13
class Washer():
def __init__(self, width, height):
self.width = width
self.height = height
def print_info(self):
print(f'洗⾐衣机的宽度是{self.width}')
print(f'洗⾐衣机的⾼高度是{self.height}')

haier1 = Washer(10, 20)
haier1.print_info()

haier2 = Washer(30, 40)
haier2.print_info()

__str__()

输出对象信息

当使用 print 输出对象的时候,默认打印对象的内存地址。如果类定义了__str__方法,那么就会打印从在这个方法中 return 的数据。

1
2
3
4
5
6
7
class Washer():
def __init__(self, width, height):
self.width = width
self.height = height

def __str__(self):
return '这是海尔洗衣机的说明书'

__del__()

删除对象时调用

当删除对象时,python 解释器也会默认调用__del__() 方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
class Washer():
def __init__(self, width, height):
self.width = width
self.height = height

def __del__(self):
print(f'{self}对象已经被删除')


haier1 = Washer(10, 20)

# <__main__.Washer object at 0x0000026118223278>对象已经被删除
del haier1

面向对象实例

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
34
35
36
37
38
39
40
41
42
43
44
45
46
# 定义类
class SweetPotato():
def __init__(self):
# 被烤的时间
self.cook_time = 0
# 地瓜的状态
self.cook_static = '生的'
# 调料列表
self.condiments = []

def cook(self, time):
"""烤地瓜的方法"""
self.cook_time += time
if 0 <= self.cook_time < 3:
self.cook_static = '生的'
elif 3 <= self.cook_time < 5:
self.cook_static = '半生不熟'
elif 5 <= self.cook_time < 8:
self.cook_static = '熟了'
elif self.cook_time >= 8:
self.cook_static = '烤糊了'

def add_condiments(self, condiment):
"""添加调料"""
self.condiments.append(condiment)

def __str__(self):
return f'这个地瓜烤了{self.cook_time}分钟, 状态是{self.cook_static}, 添加的调料有{self.condiments}'


digua1 = SweetPotato()
print(digua1)

digua1.cook(2)
digua1.add_condiments('酱油')
print(digua1)

digua1.cook(2)
digua1.add_condiments('辣椒面儿')
print(digua1)

digua1.cook(2)
print(digua1)

digua1.cook(2)
print(digua1)

执行结果:

1
2
3
4
5
这个地瓜烤了0分钟, 状态是生的, 添加的调料有[]
这个地瓜烤了2分钟, 状态是生的, 添加的调料有['酱油']
这个地瓜烤了4分钟, 状态是半生不熟, 添加的调料有['酱油', '辣椒面儿']
这个地瓜烤了6分钟, 状态是熟了, 添加的调料有['酱油', '辣椒面儿']
这个地瓜烤了8分钟, 状态是烤糊了, 添加的调料有['酱油', '辣椒面儿']
如果文章对你有用,可以请我喝杯咖啡~
  • 本文作者: Pwner
  • 本文链接: https://pwner.cn/posts/d7d6eb2.html
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!