Python 关于面向对象的 6 个问题

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.cpucom.memory 都是对象的属性,表示组合关系;com.disk 是一个字符串变量,表示聚合关系。

结语

面向对象是一种非常重要的编程范式,它可以使代码更加清晰、简洁和易于维护。Python 是一门支持面向对象的语言,并且提供了丰富的语法和功能来支持面向对象编程。

后端开发标签