跟着我们一起学 Python 30天课程-第10天-OOP Missing Pieces

作者 : IT 大叔 本文共4644个字,预计阅读时间需要12分钟 发布时间: 2020-08-21

昨天,我几乎探讨了所有关键的OOP概念。今天,我研究了其余的面向对象编程概念及其在Python中的实现。除此之外,我尝试包括一些实际的代码练习,这些练习涉及Python中OOP概念的整体用法,以从已开发的思维模型中回顾所有概念。

super()

super是Python中的保留字(在Python v 2.2中引入),该字在继承期间生效。当继承自父类的子类或子类需要调用父类的方法时,将使用super。我知道这听起来很混乱。所以这是一个例子

  • 不使用 super
class Employee:
  def __init__(self, name):
    self.name = name
    print(f'{self.name} is an employee')

class Manager(Employee):
  def __init__(self, department, name):
    self.department = department
    self.name = name
    Employee.__init__(self, name)
    print(f'Manager, {self.department} department')

staff_1 = Manager('HR', 'Andy')
# Andy is an employee
# Manager, HR department

在此,__init__通过显式使用父类名称来调用父类的构造方法,然后将self对象作为第一个参数传递。

  • 使用super(紧凑语法-无需通过self
class Employee:
  def __init__(self, name):
    self.name = name
    print(f'{self.name} is an employee')

class Manager(Employee):
  def __init__(self, department, name):
    self.department = department
    self.name = name
    super().__init__(name)
    print(f'Manager, {self.department} department')

staff_1 = Manager('HR', 'Andy')
# Andy is an employee
# Manager, HR department

就像上面代码中显示的构造方法一样,可以使用以下方法在子类内部调用父类的任何方法: super()

在JavaScript中,语法更紧凑,super类似于super(parameter)。但是我也喜欢Python语法。__init__使用调用方法更为明确super

Introspection

Python能够在运行时评估对象的类型(Python中的所有对象都是对象)。这意味着解释器能够动态地了解对象的属性和方法以及它们在运行时的可访问性。这称为自省

Python提供了一个内置功能dir来内省一个对象。

class Developer:
  def __init__(self, name, language):
    self.name = name
    self.language = language

  def introduce(self):
    print(f'Hi! I am {self.name}. I code in {self.language}')

dev = Developer('Matt', 'Python')

print(dir(dev)) # Try this in any Python REPL

Dunder Methods

在Python中,可以通过定义一些神奇的方法dunder方法来使类更强大。Dunder是double-under的简称。这些方法以双下划线作为前缀和后缀__。这些特殊方法是在Python中针对特定用例预定义的。例如,我们能够访问内置函数,因为它被定义为特殊的dunder方法__len__

创建类时,这些dunder方法可用于模拟内置类型的行为。

class Sentence:
  words = []

  def add_word(self, word):
    self.words.append(word)

  def __len__(self):
    return len(self.words)

new_sentence = Sentence()
new_sentence.add_word('Hello')
new_sentence.add_word('World')
print(len(new_sentence))

我修改了Sentence类,以便我们可以使用len默认情况下不可用的内置方法来实现自定义逻辑。Dunder方法似乎很方便!

多重继承 Multiple Inheritance

一个类可以通过Multiple Inheritance从多个类继承属性和方法。这是一个强大的概念,但也有一些警告。与JavaScript Universe相比,那里不支持多重继承。

class Batsman:
  def swing_bat(self):
    return 'What a shot!'

class Bowler:
  def bowl_bouncer(self):
    return 'What a bouncer!'

class AllRounder(Batsman, Bowler):
  pass

player = AllRounder()

print(player.bowl_bouncer()) # What a shot!
print(player.swing_bat()) # What a bouncer!

当父类具有需要初始化的构造方法时,它可能会变得有些复杂。在子类中,所有继承的类构造函数方法都需要初始化。

class Batsman:
  def __init__(self, hitting_power):
    self.hitting_power = hitting_power

  def swing_bat(self):
    return f'Shot with power {self.hitting_power}'

class Bowler:
  def __init__(self, delivery_speed):
    self.delivery_speed = delivery_speed

  def bowl_bouncer(self):
    return f'Bowled with speed of {self.delivery_speed} kmph'

class AllRounder(Batsman, Bowler):
  def __init__(self, hitting_power, delivery_speed):
    Batsman.__init__(self, hitting_power)
    Bowler.__init__(self, delivery_speed)

player = AllRounder(90, 80)
print(player.swing_bat())
print(player.bowl_bouncer())

方法解析顺序 Method Resolution Order

方法解析顺序或简称mro,是在Python中继承属性和方法的顺序。

从多个类继承时,属性和方法由子类在特定层次结构中继承。在Python中实现此功能的基础算法使用深度优先搜索算法

class Employee:
  secret_code = 'secret'

class Manager(Employee):
  secret_code = 'm123'

class Accountant(Employee):
  secret_code = 'a123'

class Owner(Manager, Accountant):
  pass

person = Owner()
print(person.secret_code) # m123

为了知道继承的顺序,Python提供了一种mro可以在对象上调用的方法来查看继承的层次结构

print(Owner.mro()) # try in a python console with above code to see the result

多重继承可能很难理解,因此这种模式在实践中并不常用。这是我在几篇文章中读到的。

今天就这些!

最后使用Python中的面向对象编程概念完成。这个挑战结束后,我的目标是在我开始构建真实的Python项目时实施这些原则。

我希望我能够涵盖Python中所有关键的面向对象程序设计概念并在不听起来很复杂的情况下共享它。

明天将涉足Python 函数编程领域。肯定会很激动。尽管Python通常是一种过程语言,并且因其面向对象的概念而广受欢迎,但本周余下时间将探索如何在Python中实现函数样式编程概念。

跟着我们一起学 Python 30天课程目录:

  1.  跟着我们一起学 Python 30天课程-第30天-免费Python资源 
  2.  跟着我们一起学 Python 30天课程-第29天-自动化测试 
  3.  跟着我们一起学 Python 30天课程-第28天-ML和数据科学II 
  4.  跟着我们一起学 Python 30天课程-第27天-ML和数据科学I 
  5.  跟着我们一起学 Python 30天课程-第26天-机器学习基础 
  6.  跟着我们一起学 Python 30天课程-第25天-Web 开发进阶
  7.  跟着我们一起学 Python 30天课程-第24天-Web开发基础 
  8.  跟着我们一起学 Python 30天课程-第23天-网页爬虫 
  9.  跟着我们一起学 Python 30天课程-第22天-脚本额外功能Scripting Extras 
  10.  跟着我们一起学 Python 30天课程-第21天-脚本编写基础 
  11.  跟着我们一起学 Python 30天课程-第20天-调试和测试 
  12.  跟着我们一起学 Python 30天课程-第19天-正则表达式 
  13.  跟着我们一起学 Python 30天课程-第18天-文件I / O 
  14.  跟着我们一起学 Python 30天课程-第17天-外部模块External Modules 
  15.  跟着我们一起学 Python 30天课程-第16天-模块基础Module Basics 
  16.  跟着我们一起学 Python 30天课程-第15天-生成器Generators 
  17.  跟着我们一起学 Python 30天课程-第14天-错误处理Error Handling 
  18.  跟着我们一起学 Python 30天课程-第13天-Decorators 
  19.  跟着我们一起学 Python 30天课程-第12天-Lambda Expressions & Comprehensions 
  20.  跟着我们一起学 Python 30天课程-第11天-函数编程Functional Programming基础 
  21.  跟着我们一起学 Python 30天课程-第10天-OOP Missing Pieces 
  22.  跟着我们一起学 Python 30天课程-第9天-OOP Pillars 
  23.  跟着我们一起学 Python 30天课程-第8天-OOP基础知识 
  24.  跟着我们一起学 Python 30天课程-第7天-开发环境搭建(Developer Environment) 
  25.  跟着我们一起学 Python 30天课程-第6天-循环II和函数(Loops II & Functions) 
  26.  跟着我们一起学 Python 30天课程-第5天-条件和循环I(Conditions & Loops I) 
  27.  跟着我们一起学 Python 30天课程-第4天-数据类型III(Data Types III) 
  28.  跟着我们一起学 Python 30天课程-第3天-数据类型II(Data Types II) 
  29.  跟着我们一起学 Python 30天课程-第2天-数据类型I(Data Types I) 
  30.  跟着我们一起学 Python 30天课程-第1天-简介 
免责声明:
1. 本站资源转自互联网,源码资源分享仅供交流学习,下载后切勿用于商业用途,否则开发者追究责任与本站无关!
2. 本站使用「署名 4.0 国际」创作协议,可自由转载、引用,但需署名原版权作者且注明文章出处
3. 未登录无法下载,登录使用金币下载所有资源。
IT小站 » 跟着我们一起学 Python 30天课程-第10天-OOP Missing Pieces

常见问题FAQ

没有金币/金币不足 怎么办?
本站已开通每日签到送金币,每日签到赠送五枚金币,金币可累积。
所有资源普通会员都能下载吗?
本站所有资源普通会员都可以下载,需要消耗金币下载的白金会员资源,通过每日签到,即可获取免费金币,金币可累积使用。

发表评论