面向对象
# 面向对象
Python 是一门面向对象编程(Object-Oriented Programming,OOP)的语言,支持面向对象编程的所有核心特性,包括类、对象、继承、封装、多态等。下面是 Python 面向对象编程中的一些基本概念:
- 类(Class):类是面向对象编程中的基本概念,是对象的模板。类定义了对象的属性和方法,可以通过实例化来创建对象。
- 对象(Object):对象是类的一个实例,拥有类定义的属性和方法。可以通过类来访问对象的属性和方法。
- 属性(Attribute):属性是对象的数据成员,用于描述对象的特征。可以通过点号(.)访问对象的属性。
- 方法(Method):方法是类定义的函数,用于操作对象。方法可以访问对象的属性,并可以改变它们的值。
- 继承(Inheritance):继承是一种机制,允许一个类派生出一个子类,子类继承了父类的属性和方法。子类可以添加新的属性和方法,也可以重载父类的方法。子类默认继承父类的所有属性和方法。所有类默认继承自 object 类,object 类是顶级类或基类,其他类为子类或派生类。
- 封装(Encapsulation):封装是一种隐藏对象内部实现的机制。对象的属性和方法可以被限制在对象内部,不允许外部直接访问和修改。
- 多态(Polymorphism):多态是一种机制,允许不同对象的相同方法表现出不同的行为。在 Python 中,多态通过方法的重载和重写实现。多态依赖于继承。
- 私有(private):私有权限的属性和方法就无法继承给子类,只要在属性和方法前面加
___
就可以。 - 魔法方法:魔法方法是指在 Python 中自动执行的代码,用于实现类的特定功能。在 Python 中,魔法方法通常用 "__" 符号开头,例如 "init" 表示初始化方法,"str" 表示打印方法,"len" 表示长度方法等等。
- 类属性(Class Attributes):类对象所拥有的属性,它被该类所有的对象所共有。类属性可以使用类对象和类实例访问。
- 类方法(Class Methods): 需要使用装饰器@classmethod来标识其为类方法,对于类方法,第一个参数必须是类对象,一般以cls作为第一个参数。类方法一般和类属性配合使用。
- 静态方法 (Static Methods):需要使用装饰器@staticmethod来标识其为静态方法。静态方法既不需要传递类对象也不需要传递实例对象。静态方法也能通过类对象和实例对象去访问。
常用魔法方法:魔法方法是 Python 中实现面向对象编程的重要机制之一,可以使代码更加灵活和可扩展。
"__init__"
:用于初始化对象。当对象实例化时,会自动调用 "init" 方法,因此可以通过调用实例的 "init" 方法来初始化对象的属性。"__str__"
:用于打印对象的字符串表示。当对象被打印时,会自动调用 "str" 方法,因此可以通过调用对象的 "str" 方法来打印对象的字符串表示。"len"
:用于访问对象的长度。当对象被访问时,会自动调用 "len" 方法,因此可以通过调用对象的 "len" 方法来访问对象的长度。"__del__"
:删除对象的时候自动调用"del"魔法方法。"getitem"
:用于访问对象的属性或索引。当对象被作为索引访问时,会自动调用 "getitem" 方法,因此可以通过调用对象的 "getitem" 方法来访问对象的属性。__mro__
:获取某个类的继承顺序关系。
# 面向对象三大特征:
- 封装
- 继承
- 多态
# 类与继承
在 Python 中,可以通过定义类和实例化对象来实现面向对象编程。下面是一个简单的 Python 类的示例:
# 经典类,不由任何内置类派生出的类
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def say_hello(self):
print("Hello, my name is", self.name)
person1 = Person("Alice", 25)
person2 = Person("Bob", 30)
person1.say_hello()
person2.say_hello()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
# 新式类:工作场景下都需要写新式类这种方法
class Person(object):
def __init__(self, a, b):
self.weight = a
self.age = b
print(f'人类xxx的体重是:{self.weight}')
print(f'人类xxx的年龄是:{self.age}')
def __str__(self):
return "我是人类字符串的输出"
def __del__(self):
print('人类对象已经被删除')
def walk(self):
print('人类在行走')
class Hyothere(object):
def __init__(self, a, b):
print('创建猛兽父类')
self.weight = a
self.age = b
# 定义私有属性
self.__money = 1000000
print(f'猛兽的体重是:{self.weight}')
print(f'猛兽的年龄是:{self.age}')
def walk(self):
print('猛兽在行走')
def __del__(self):
print('猛兽对象已经被删除')
def get_money(self):
return self.__money
def set_money(self, v):
self.__money = v
# 单继承 子类 继承person类
class Female(Hyothere, Person):
def __init__(self, a, b):
print('创建子类')
self.weight = a
self.age = b
print(f'子类xxx的体重是:{self.weight}')
print(f'子类xxx的年龄是:{self.age}')
def walk(self):
self.__init__()
print('子类在行走')
def __del__(self):
print('子类对象已经被删除')
def do_person_walk(self, a, b):
Person.__init__(self, a, b)
Person.walk(self)
def do_hyothere_walk(self, a, b):
Hyothere.__init__(self, a, b)
Hyothere.walk(self)
test = Female(300, 400)
# test.walk()
# print(Female.__mro__)
test.do_person_walk(300, 400)
test.do_hyothere_walk(300, 400)
print(test.get_money())
test.set_money(2222222222222222222222)
print(test.get_money())
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# 类方法、静态方法、类属性、实例属性
class Dog(object):
# 定义类属性
tooth = 100
# 私有类属性
__tooth = 200
def work(self):
print('指哪儿打哪儿......')
# 类方法
@classmethod
def get_tooth(cls):
return cls.__tooth
# 静态方法
@staticmethod
def static_info():
print('hello 这是一个静态方法......')
class ArmyDog(Dog):
def work(self):
print('追击敌人......')
class DrugDog(Dog):
def work(self):
print('追查毒品......')
class Person(object):
def work_with_dog(self, dog):
dog.work()
p = Person()
p.work_with_dog(ArmyDog())
print(f'访问类属性:{Dog.tooth}')
Dog.tooth = 2000
print(f'访问类属性:{Dog.tooth}')
print(f'访问类方法:{Dog.get_tooth()}')
Dog.static_info()
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
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
编辑 (opens new window)
上次更新: 2025/02/10, 20:20:37