使用python实现面向对象的三大特征:封装 继承 多态
使用python,实现面向对象的三大特征:封装继承多态
https://blog.csdn.net/weixin_57324246/article/details/118667217
class Car:
def __init__(self, color, model):
self.__color = color
self.__model = model
def get_color(self):
return self.__color
def get_model(self):
return self.__model
car1 = Car("red", "BMW")
print(car1.get_color()) # Output: red
在上面的例子中,我们创建了一个Car
类,并使用__init__()
方法来初始化对象的颜色和型号属性。属性前加上双下划线“__”表示该属性是私有的,外部无法直接访问。我们使用公有的get_color()
和get_model()
方法来获取对象的私有属性值,从而实现了封装。
class Animal:
def __init__(self, name):
self.name = name
def speak(self):
print("The animal speaks")
class Dog(Animal):
def __init__(self, name):
super().__init__(name)
def speak(self):
print("The dog barks")
animal1 = Animal("random")
animal1.speak() # Output: The animal speaks
dog1 = Dog("Max")
dog1.speak() # Output: The dog barks
在上面的例子中,我们创建了一个Animal
类,其中包含一个speak()
方法。然后我们定义了一个Dog
类,它继承了Animal
类,并覆盖了speak()
方法。使用super()
函数调用父类的__init__()
方法来设置name
属性的值。这样,我们创建一只Dog
对象,它将继承父类的所有属性和方法,并可以覆盖它所需的方法,从而实现了继承。
class Animal:
def __init__(self, name):
self.name = name
def speak(self):
print("The animal speaks")
class Dog(Animal):
def __init__(self, name):
super().__init__(name)
def speak(self):
print("The dog barks")
class Cat(Animal):
def __init__(self, name):
super().__init__(name)
def speak(self):
print("The cat meows")
def speak_animal(animal):
animal.speak()
animal1 = Animal("random")
dog1 = Dog("Max")
cat1 = Cat("Misty")
speak_animal(animal1) # Output: The animal speaks
speak_animal(dog1) # Output: The dog barks
speak_animal(cat1) # Output: The cat meows
在上面的例子中,我们创建了Animal
、Dog
和Cat
类。它们都具有speak()
方法,但实现方式不同。然后我们定义了一个speak_animal()
函数,它接受一个Animal
类型的参数并调用speak()
方法。当我们传递一个Animal
、Dog
或Cat
对象时,它们将调用其特定类的speak()
方法,从而实现了多态。speak_animal()
函数可以处理不同类型的动物对象,无需了解具体的类型,只需要知道它们有一个共同的speak()
方法。
封装:
在Python中,我们可以使用类来实现封装。通过将属性和方法封装在类中,我们可以将其视为单个实体,并在必要时只暴露必要的接口。以下代码示例将演示如何在Python中实现封装:
class Car:
def __init__(self, make, model, year):
self.make = make
self.model = model
self.year = year
self.__odo = 0 # 私有属性
def __drive(self): #私有方法
print("Car is driving.")
def start(self):
self.__drive()
def get_odo(self): #公有方法
return self.__odo
def update_odo(self, odo):
if odo >= self.__odo:
self.__odo = odo
在上面这个例子中,我们创建了一个汽车类,该类有公有和私有方法和属性。我们使用__
来表示私有方法和属性,以便将其封装在类中,只公开所需的接口。例如,我们可以使用公有方法get_odo()
来获取私有属性__odo
的值,而不能直接访问它。另外,我们可以使用start()
方法来调用私有方法__drive()
,而不需要从外部直接访问。
继承:
在Python中,我们可以使用继承来扩展已有的类,从而创建新的类。例如,我们可以创建一个新类,该类继承了汽车类,并具有更多的特性。
class ElectricCar(Car):
def __init__(self, make, model, year, battery_size):
super().__init__(make, model, year)
self.battery_size = battery_size
def charge(self):
print("Charging battery.")
在上面这个例子中,我们创建了一个ElectricCar
类,该类继承了Car
类。我们使用super()
函数来调用Car
类的__init__
方法,以便在初始化时设置相同的属性。在ElectricCar
类中,我们还添加了一个新的属性battery_size
和一个新的方法charge()
,以打印一条消息来表示正在充电。
多态:
在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
在上面这个例子中,我们创建了一个基类Shape
和两个派生类Rectangle
和Circle
。每个类都定义了一个area()
方法,用于计算其形状的面积。由于Rectangle
和Circle
都实现了area()
方法,因此可以将它们视为具有相同方法名称的实体。也就是说,在代码其他地方,我们可以调用area()
方法,而无需关心具体是什么形状。在运行时,Python根据对象类型动态确定要调用的方法。