一、Python面向对象的三大特性
Python作为一种面向对象的编程语言,具有三大特性:封装、继承和多态。
1、封装
封装是指将对象的某些属性和方法隐藏起来,不允许外部程序直接访问和修改。Python中通过在某些属性和方法名前添加两个下划线“__”实现了属性和方法的私有化,这种方式也被称为“名称重整”(name mangling)。
class Car: def __init__(self, color, model): self.__color = color self.model = model def get_color(self): return self.__color def set_color(self, color): self.__color = color my_car = Car("red", "Tesla Model S") print(my_car.get_color()) # 输出:red my_car.set_color("blue") # 修改颜色为blue print(my_car.get_color()) # 输出:blue
上面的代码中,我们将Car类的颜色属性私有化了,外部无法直接访问,只能通过公共的get_color和set_color方法来获取或修改颜色属性的值。
2、继承
Python中的继承是一种创建新类的方式,新类可以继承现有类的方法和属性,从而避免代码冗余和提高代码复用性。Python中使用圆括号指定继承的基类,如果省略基类,则默认为object。
class Animal: def __init__(self, name, age): self.name = name self.age = age def say_hello(self): print("I'm an animal.") class Dog(Animal): def __init__(self, name, age, breed): super().__init__(name, age) self.breed = breed def say_hello(self): print("I'm a dog.") my_dog = Dog("Tom", 3, "Husky") my_dog.say_hello() # 输出:I'm a dog.
上面的代码中,我们定义了一个Animal基类,其中有name和age两个属性,以及say_hello方法。然后我们再定义一个Dog类,并继承Animal类,新增breed属性和重新实现say_hello方法。这样我们就可以使用Dog类的对象来访问原来Animal类的方法和属性,也可以扩展和修改原来的属性和方法。
3、多态
多态是指同一个方法可以作用于不同的对象,并根据对象的类型执行不同的操作。Python中的多态实现非常简单,无需特别的声明即可完成。
class Shape: def area(self): pass class Rectangle(Shape): def __init__(self, width, height): self.width = width self.height = height def area(self): return self.width * self.height class Circle(Shape): def __init__(self, radius): self.radius = radius def area(self): return 3.14 * self.radius ** 2 my_rectangle = Rectangle(3, 4) my_circle = Circle(5) print(my_rectangle.area()) # 输出:12 print(my_circle.area()) # 输出:78.5
上面的代码中,我们定义了一个Shape基类,其中有一个area方法,但是不做具体实现,因为不同的形状会有不同的计算公式。然后我们分别定义了Rectangle和Circle两个类,都继承自Shape类,并分别实现了自己的area方法,这样我们就可以使用不同的对象调用相同的方法并得到不同的结果。
二、Python面向对象的四大特性
有时候我们也会把多态理解为Python面向对象的四大特性之一,这样就得到了封装、继承、多态以及抽象四个特性。
1、抽象
抽象是指将一个复杂的实体或问题简化成一些关键的特征和属性,然后忽略其他的次要特征。Python中实现抽象的方式是通过接口或者抽象基类(Abstract Base Classes)来实现。
from abc import ABC, abstractmethod class Shape(ABC): @abstractmethod def area(self): pass class Rectangle(Shape): def __init__(self, width, height): self.width = width self.height = height def area(self): return self.width * self.height class Circle(Shape): def __init__(self, radius): self.radius = radius def area(self): return 3.14 * self.radius ** 2 my_rectangle = Rectangle(3, 4) my_circle = Circle(5) print(my_rectangle.area()) # 输出:12 print(my_circle.area()) # 输出:78.5
上面的代码中,我们定义了一个Shape基类,并规定了area方法必须被子类实现。这样就保证了所有的形状对象都必须实现自己的area方法,并且可以直接使用Shape类对象去调用area方法,从而达到了抽象的目的。
三、面向对象程序设计的特性
面向对象程序设计具有以下特性:
1、封装数据和行为
数据和行为被作为一个整体进行封装,从而保护了数据的独立性和安全性。
2、继承和子类化
子类可以从父类中继承属性和方法,并且也可以根据自己的需要添加新的属性和方法。
3、多态
同一个方法可以作用于不同的对象,并根据对象的类型执行不同的操作。
4、模块化开发
不同的类可以分别定义在不同的文件中,以达到更好的模块化开发和代码管理。
5、接口和抽象类
接口和抽象类可以约束子类必须实现哪些方法和属性,并且可以达到更好的代码扩展和复用。