五分钟透彻理解Python继承与多态

文末赠免费精品编程资料~~

想象一下,你是一位魔法师,拥有创造生物的魔法。你先创造了“动物”这个基本法术,之后只需稍作修改,就能创造出“狗”、“猫”等具体生物。这就像Python中的继承——从一个基础类(父类)出发,创建出具有相似特性但又有各自特色的子类。而多态,则是让这些不同生物都能响应“叫”这个命令,但发出的声音却各不相同。让我们一步步揭开它们的神秘面纱。

继承:魔法的基础

继承是面向对象编程的核心概念之一,它允许我们定义一个类,继承另一个类的属性和方法。这样可以重用代码,减少重复,并且可以更灵活地构建复杂系统。

示例1:动物王国的基础

class Animal:
    def __init__(self, name):
        self.name = name
    
    def speak(self):
        raise NotImplementedError("子类必须实现speak方法")

# 狗类继承自动物类
class Dog(Animal):
    def speak(self):
        return f'{self.name} says Woof!'

# 测试
fido = Dog('Fido')
print(fido.speak())

输出结果:

Fido says Woof!
  • 解释Dog类继承了Animal类的所有属性和方法,然后重写了speak方法,实现了特定的行为。

多态:魔法的多样性

多态意味着你可以对不同类型的对象使用相同的操作,而具体行为由对象自身的类型决定。在Python中,通过覆盖或实现父类的方法来体现多态。

示例2:多态的魅力

class Cat(Animal):
    def speak(self):
        return f'{self.name} says Meow!'
    
# 测试多态
animals = [Dog('Buddy'), Cat('Whiskers')]
for animal in animals:
    print(animal.speak())

输出结果:

Buddy says Woof!
Whiskers says Meow!
  • 解释:尽管调用的是相同的speak方法,但由于对象的实际类型不同,输出结果也不同。这就是多态的力量。

进阶:继承的细节与技巧

  • 多重继承:Python支持类从多个父类继承。
class SuperDog(Dog, Animal): # 注意:Python 3.7+保证了MRO(方法解析顺序)
    pass
  • 初始化方法:确保正确调用父类的__init__方法。
class Animal:
    def __init__(self, name, color="unknown"):
        super().__init__()  # Python 3,自动调用父类初始化
        self.name = name
        self.color = color
  • 方法重写注意事项:重写时要意识到是否真的需要覆盖父类的行为。

抽象基类与接口

在Python中,虽然没有严格意义上的接口(Interface),但可以使用abc模块来创建抽象基类(ABC),强制子类实现特定的方法。

示例3:抽象基类的应用

from abc import ABC, abstractmethod

class LibraryItem(ABC):
    @abstractmethod
    def display_details(self):
        """显示详细信息"""
        pass

class Book(LibraryItem):
    def __init__(self, title, author):
        self.title = title
        self.author = author
    
    def display_details(self):
        print(f"Book Title: {self.title}, Author: {self.author}")

# 如果不实现抽象方法,会报错
class MissingDetails(LibraryItem): pass  # 运行这段会抛出TypeError

# 测试
book = Book('Python for Dummies', 'John Smith')
book.display_details()
  • 解释:通过定义抽象方法display_details,确保任何继承自LibraryItem的类都必须实现这一方法,增强了代码的健壮性。

封装与私有属性

封装是面向对象的另一大特性,Python通过命名约定(前缀双下划线__)来实现“私有化”。

示例4:封装实例

class PrivateExample:
    def __init__(self, private_value):
        self.__private_value = private_value
    
    def get_private_value(self):
        return self.__private_value

# 尝试直接访问私有属性
example = PrivateExample(42)
# example.__private_value  # 错误方式,不应该直接访问
print(example.get_private_value())  # 正确访问方式
  • 注意:虽然Python提供了这样的访问限制,但实际上仍可通过特殊方法访问(不推荐),强调的是编程习惯和逻辑上的封装。

练习与提升

  • 练习1:设计一个简单的图形类层次结构,包括一个基类Shape以及两个子类CircleRectangle,实现计算面积的方法。
  • 练习2:利用抽象基类,创建一个动物声音播放器,定义一个抽象基类AnimalSoundPlayer,至少有两个子类实现不同的动物声音播放。

总结

深入理解继承与多态不仅限于语法,更重要的是理解其背后的原理和设计模式。通过抽象基类加强类型约束,利用封装保护数据,都是提高代码质量的关键。

好了,今天的分享就到这里了,我们下期见。如果本文对你有帮助,请点赞、转发、点个在看吧!

文末福利

请关注下方公众号并后台回复编程资料免费获取Python编程、人工智能、爬虫等100+本精品电子书。

往期推荐

15个Python数据分析实用技巧

Python高效编程的20个最佳实践

Python print高级格式化技巧大全

Python高效编程的20个最佳实践

Python print高级格式化技巧大全

  • 16
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先需要了解得物网站的数据结构和爬取方式,得物网站比较复杂,需要使用Selenium+BeautifulSoup进行爬取。 以下是一个简单的得物爬虫Python代码实现(注:仅供学习参考,请勿用于商业用途): ```python import time from selenium import webdriver from selenium.webdriver.chrome.options import Options from bs4 import BeautifulSoup options = Options() options.add_argument('--no-sandbox') # 解决DevToolsActivePort文件不存在报错的问题 options.add_argument('window-size=1920x3000') # 指定浏览器分辨率 options.add_argument('--disable-gpu') # 谷歌文档提到需要加上这个属性来规避bug options.add_argument('--hide-scrollbars') # 隐藏滚动条, 应对一些特殊页面 options.add_argument('blink-settings=imagesEnabled=false') # 不加载图片, 提升速度 options.add_argument('--headless') # 无界面 driver = webdriver.Chrome(options=options) url = 'https://www.dewu.com/' driver.get(url) # 等待页面加载完成 time.sleep(3) # 模拟鼠标点击,展开商品列表 driver.find_element_by_xpath('//div[text()="全部商品"]').click() # 等待页面加载完成 time.sleep(3) # 获取页面源代码 html = driver.page_source # 解析页面 soup = BeautifulSoup(html, 'html.parser') # 获取商品列表 items = soup.find_all('div', {'class': 'item-card'}) for item in items: # 获取商品标题 title = item.find('div', {'class': 'title'}).text.strip() # 获取商品价格 price = item.find('div', {'class': 'price'}).text.strip() # 获取商品链接 link = item.find('a', {'class': 'item-link'})['href'] print(title, price, link) # 关闭浏览器 driver.quit() ``` 这里的代码仅仅是一个简单的爬虫示例,如果想要更加深入地了解得物网站的数据结构和爬取方式,需要结合具体的需求进行更加详细的分析和实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值