1. 继承(Inheritance)
继承是面向对象编程中的一个重要概念,它允许一个类(子类)继承另一个类(父类)的属性和方法。子类可以重用父类的代码,同时也可以扩展或修改父类的行为。
常用方法和参数:
class
关键字用于定义类。- 子类的定义中使用括号指定要继承的父类。
示例:
class Animal:
def __init__(self, name):
self.name = name
def speak(self):
raise NotImplementedError("Subclass must implement abstract method")
class Dog(Animal):
def speak(self):
return f"{self.name} says Woof!"
class Cat(Animal):
def speak(self):
return f"{self.name} says Meow!"
dog = Dog("Buddy")
print(dog.speak()) # 输出:Buddy says Woof!
cat = Cat("Whiskers")
print(cat.speak()) # 输出:Whiskers says Meow!
常见问题和解决方案:
-
如何判断一个类是否是另一个类的子类?
- 可以使用
issubclass()
函数。例如:issubclass(Dog, Animal)
返回True
。
- 可以使用
-
子类如何调用父类的方法?
- 使用
super()
函数。例如,在子类中调用super().__init__()
。
- 使用
-
子类如何扩展父类的方法?
- 在子类中定义新的方法或者重写父类的方法。
-
是否可以多重继承?
- 是的,Python支持多重继承,一个类可以继承多个父类。
-
如何查看一个类的继承关系?
- 可以使用
mro()
方法。例如:Dog.mro()
返回继承顺序列表。
- 可以使用
2. 封装(Encapsulation)
封装是一种将数据和操作数据的方法捆绑在一起的编程概念。它可以通过将属性和方法设置为私有的来隐藏内部实现细节,只允许通过公共方法来访问和修改数据。
常用方法和参数:
- 使用双下划线
__
开头的属性和方法被视为私有的,外部无法直接访问。
示例:
class Car:
def __init__(self, brand, model):
self.__brand = brand
self.__model = model
def get_brand(self):
return self.__brand
def set_brand(self, brand):
self.__brand = brand
def get_model(self):
return self.__model
def set_model(self, model):
self.__model = model
car = Car("Toyota", "Corolla")
print(car.get_brand()) # 输出:Toyota
car.set_brand("Honda")
print(car.get_brand()) # 输出:Honda
print(car.__brand) # 报错,因为私有属性只能在类内部访问
常见问题和解决方案:
-
为什么要使用封装?
- 封装可以保护对象的数据,防止直接修改和访问,从而减少了意外修改数据的可能性。
-
如何访问私有属性?
- 可以通过公共方法来访问私有属性。
-
是否可以在类的外部直接修改私有属性?
- 不可以,私有属性只能在类的内部访问和修改。
-
如何避免子类覆盖父类的私有属性和方法?
- 将私有属性和方法命名为受保护的属性和方法(以单下划线
_
开头)。
- 将私有属性和方法命名为受保护的属性和方法(以单下划线
-
私有属性和受保护的属性有什么区别?
- 私有属性只能在类内部访问,而受保护的属性可以在类及其子类中访问。
3. 多态(Polymorphism)
多态是面向对象编程的另一个重要概念,它允许不同类的对象对同一消息做出响应,实现了同一种行为具有多种表现形式的能力。
常用方法和参数:
- Python 中的多态主要通过方法的重写和继承来实现。
示例:
class Shape:
def area(self):
raise NotImplementedError("Subclass must implement abstract method")
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 * self.radius
shapes = [Rectangle(4, 5), Circle(3)]
for shape in shapes:
print(shape.area())
常见问题和解决方案:
-
如何实现多态?
- 在不同的类中实现同名的方法,并确保它们在适当的情况下做出正确的响应。
-
多态和继承有什么关系?
- 多态通常与继承一起使用,子类重写父类的方法,实现了多态的特性。
-
如何判断一个对象是否是特定类的实例?
- 可以使用
isinstance()
函数。例如:isinstance(obj, MyClass)
返回True
或False
。
- 可以使用
-
多态是否只能应用于类的方法?
- 不是,多态可以应用于函数和方法。函数或方法可以接受不同类型的参数,并根据参数类型执行不同的操作。
-
是否只有继承才能实现多态?
- 不是,除了继承,还可以通过接口实现多态。Python 不支持接口,但可以通过协议来实现类似的功能。