1. 什么是面向对象?
面向对象(Object Oriented Programming,简称 OOP),是一种基于对象的程序设计思想,是一种将现实世界中的事物抽象成程序中的对象,并通过对象之间的交互来实现程序功能的编程范式。
OOP 的三大特征:
封装:将数据和操作数据的方法捆绑在一起,对外只暴露接口,隐藏内部细节;
继承:子类可以继承父类的属性和方法,并且还可以新增自己的属性和方法;
多态:父类的引用可以指向子类的对象,并且调用同名方法时会根据对象的不同而表现出不同的行为。
2. Python 中的类和对象
2.1 类的定义
在 Python 中,用关键字 class
定义类:
class MyClass:
"""这是一个简单的类示例"""
pass
注意:pass
表示空语句,是一个占位符,因为 Python 不允许空的代码块。
2.2 对象的创建
一个类就像是一个蓝图,可以用它来创建多个对象,对象是类的实例。
class Person:
def __init__(self, name, age, gender):
self.name = name
self.age = age
self.gender = gender
p1 = Person('Tom', 18, 'male') # 创建一个 Person 类的对象
print(p1.name) # 输出:Tom
注意:__init__
是一个特殊方法,在对象创建的时候自动调用。
3. self 的作用
self
表示对象本身,用于引用对象的属性和方法,必须在方法的参数列表中显式声明,且通常作为第一个参数。
class Person:
def __init__(self, name, age, gender):
self.name = name
self.age = age
self.gender = gender
def say_hello(self):
print(f"Hello, my name is {self.name}.")
p2 = Person('Lucy', 20, 'female')
p2.say_hello() # 输出:Hello, my name is Lucy.
注意:self
可以换成其他名称,但是约定俗成使用 self
。
4. 继承与多态
4.1 继承的语法
Python 支持单继承和多继承。
4.1.1 单继承
这是最简单的继承方式,子类只继承一个父类的属性和方法。
class Animal:
def __init__(self, name):
self.name = name
def make_sound(self):
print("I can't make any sound.")
class Cat(Animal):
def __init__(self, name):
super().__init__(name)
def make_sound(self):
print('Mew~')
c = Cat('Kitty')
c.make_sound() # 输出:Mew~
注意:super()
表示调用父类的方法。
4.1.2 多继承
多继承可以同时继承多个父类的属性和方法,但是容易导致命名冲突,需要注意先后顺序。
class A:
def hello(self):
print('Hello from A.')
class B:
def hello(self):
print('Hello from B.')
class C(A, B):
pass
c = C()
c.hello() # 输出:Hello from A.
4.2 多态的实现
由于 Python 属于动态类型语言,所以多态的实现需要靠函数参数类型的判断来完成。
class Animal:
def __init__(self, name):
self.name = name
def make_sound(self):
pass
class Dog(Animal):
def __init__(self, name):
super().__init__(name)
def make_sound(self):
print('Woof!')
class Cat(Animal):
def __init__(self, name):
super().__init__(name)
def make_sound(self):
print('Mew~')
def animal_sounds(animal):
animal.make_sound()
a = Animal('Animal')
d = Dog('DangDang')
c = Cat('Kitty')
animal_sounds(a) # 输出:I can't make any sound.
animal_sounds(d) # 输出:Woof!
animal_sounds(c) # 输出:Mew~
注意:animal_sounds
函数的参数是 animal
,可以传入任何继承了 Animal
类的对象,并调用它们的 make_sound
方法。
5. 私有属性和方法
在 Python 中,通过在属性和方法名称前加上两个下划线(__
)来表示私有。
class Foo:
def __init__(self):
self.__private_attr = 123 # 私有属性
def __private_method(self): # 私有方法
print('This is a private method.')
f = Foo()
print(f.__private_attr) # 报错:'Foo' object has no attribute '__private_attr'
f.__private_method() # 报错:'Foo' object has no attribute '__private_method'
注意:在 Python 中,私有属性和方法并不是真正的私有,只是命名上的约定,可以通过一些特殊方式来访问。
6. 组合与聚合
组合和聚合是两种实现对象关联关系的方式:
组合:对象 A 持有对象 B,对象 B 表示对象 A 的一部分,对象 B 的生命周期和对象 A 相同或者比对象 A 更短。
聚合:对象 A 持有对象 B 的引用,对象 B 不是对象 A 的一部分,对象 B 的生命周期和对象 A 可能不同甚至比对象 A 更长。
class CPU:
def run(self):
print('CPU is running.')
class Memory:
def save(self):
print('Memory is saving.')
class Computer:
def __init__(self):
self.cpu = CPU() # 组合
self.memory = Memory() # 组合
self.disk = '1TB' # 聚合
com = Computer()
com.cpu.run()
com.memory.save()
print(com.disk)
注意:com.cpu
和 com.memory
都是对象的属性,表示组合关系;com.disk
是一个字符串变量,表示聚合关系。
结语
面向对象是一种非常重要的编程范式,它可以使代码更加清晰、简洁和易于维护。Python 是一门支持面向对象的语言,并且提供了丰富的语法和功能来支持面向对象编程。