跟着我们一起学 Python 30天课程-第9天-OOP Pillars

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

当我在小学五年级时,我在学校教的第一门语言是BlueJ。这是一个为初学者设计的Java开发环境,当时有我们学校的课程。那是我对面向对象编程的第一次介绍。尽管那段日子我不太了解,但我仍然对我们的计算机老师讲解OOP的各个要素留下了生动的回忆。今天在探索Python中OOP的原理时,我回想起了一些老师的类比,并尝试将它们与我自己的一些融合。

OOP基本上有4个支柱或核心原则,即所谓的OOP Pillars

  • 封装 -在我之前的文章中介绍了OOP的基础知识时,我已经间接介绍了封装。用简单的术语封装意味着创建一个容器,在该容器中,属性和与这些属性相关联的动作被分组在一起。
class Avenger:
  def __init__(self, name, knownAs):
    self.name = name
    self.knownAs = knownAs

  def reveal_identity(self):
    print(f'I am {self.name}, also known as {self.knownAs}')

hulk = Avenger('Bruce Banner', 'Hulk')
iron_man = Avenger('Tony Stark', 'IronMan')

hulk.reveal_identity() # I am Bruce Banner, also known as Hulk
iron_man.reveal_identity() # I am Tony Stark, also known as IronMan

在上面的类中,当reveal_identity调用该方法时,将显示每个复仇者的身份。换句话说,它们的身份已被封装。这些执行某些操作的方法使类变得如此强大。从类创建对象时,我们可以调用这些方法来执行操作,而不必理会它们如何执行这些操作。就像复仇者联盟!

  • 抽象 -要学习驾驶汽车,我们仅需要了解3件事-A,B和C,即加速器,制动器和离合器(现在有自动驾驶汽车,它甚至更简单)。作为驾驶员,我们不需要知道是什么使汽车加速,或者在刹车时汽车如何停止。这称为抽象。它在现实生活中无处不在。轻按电源按钮即可启动计算机,在屏幕上轻按一下即可从我们的手机中捕获照片。在上面的示例中,该reveal_identity方法是抽象的。
class Avenger:
  def __init__(self, name, knownAs):
    self.name = name
    self.knownAs = knownAs

  def reveal_identity(self):
    print(f'I am {self.name}, also known as {self.knownAs}')

hulk = Avenger('Bruce Banner', 'Hulk')

hulk.name = 'Thanos'
hulk.knownAs = 'Loki'

hulk.reveal_identity() # I am Thanos, also known as Loki

上面的类实现存在问题。尽管创建了绿巨人,但Loki还是决定将绿巨人伪装成Thanos!尽管实现了封装和抽象,但这并不是现在想要的,内部功能可以从外部进行篡改或修改。

Python默认不支持创建私有变量。将不得不探索更多,以查看是否有可能使变量和方法不可访问并获得真实的抽象。

但是,有一个约定是通过在变量前添加前缀来创建私有变量_。这使其他开发人员可以将其识别为私有变量,而不会偶然尝试更新那些变量和方法(尽管可以)。这与我们在JavaScript Universe中定义私有变量的方式非常相似。

  • 继承 -顾名思义,继承是指从父级继承属性和功能的方法。基于父类,可以创建从父类继承的任意数量的子类。这样做是为了在相似的类之间共享功能,而不必一次又一次地编写相同的逻辑。
class Player:
  def __init__(self, name, age):
    self.name = name
    self.age = age

  def run(self):
    return f'{self.name} is running'

class Cricketer(Player): # Syntax to inherit a class
  def catch_ball(self):
    return f'{self.name} Caught the ball'

class Batsman(Cricketer):
  def swing_bat(self):
    return f'what a shot by {self.name}'

player1 = Batsman('Virat Kohli', 31)

print(player1.run())
print(player1.catch_ball())
print(player1.swing_bat())

player1Batsman类的一个实例。击球手板球运动员的子类 。在JavaScript世界中,使用extends关键字继承类。因此,我只是在两者的心理模型中创建了另一个比较。Cricketer类仍然是Player的子类或子类,换句话说,它继承了Player类。

由于player1是从Batsman创建的对象,因此它具有摆动蝙蝠的动作。

它还继承了Cricketer类接球的能力。很酷!

它还继承了从Player类运行的功能。

在Python中,有一个非常方便的内置函数isinstance用于检查对象是否是类的实例。

class Player:
  def __init__(self, name, age):
    self.name = name
    self.age = age

  def run(self):
    return f'{self.name} is running'

class Cricketer(Player):
  def catch_ball(self):
    return f'{self.name} Caught the ball'

class Batsman(Cricketer):
  def swing_bat(self):
    return f'what a shot by {self.name}'

player1 = Batsman('Virat Kohli', 31)

print(isinstance(player1, Batsman)) # True
print(isinstance(player1, Cricketer)) # True
print(isinstance(player1, Player)) # True
print(isinstance(player1, object)) # True

由于Python中的所有内容都是对象,因此所有类都将从该基类对象继承所有属性和方法

  • 多态 -多表示多种,态表示形式。因此,它的字面意思是以多种形式出现。它是按要素分类的要素对象类可以共享相同的方法,但是这些方法可以根据对象调用它们的方式执行不同的操作。
class ProgrammingLanguage:
  def __init__(self, name):
    self.name = name

class JavaScript(ProgrammingLanguage):
  def comment(self):
    return(f'// A Comment in {self.name}')

class Python(ProgrammingLanguage):
  def comment(self):
    return(f'# A comment in {self.name}')

language1 = JavaScript('JavaScript')
language2 = Python('Python')

def add_comment(languageObject):
  print(languageObject.comment())

add_comment(language1) # // A Comment in JavaScript
add_comment(language2) # # A comment in Python

for language in [language1, language2]:
  print(language.comment())
# // A Comment in JavaScript
# # A comment in Python

在上面的代码块中,我创建了一个通用函数add_comment,该函数接受编程语言对象并在其上调用comment()方法。相同的注释方法在对不同对象进行调用时会基于其注释方法的实现而产生不同的结果。

在第二种情况下,当遍历语言对象列表时,对它们调用相同的方法会产生不同的结果。

这是多态性。

尽管对于何时使用哪种OOP原则没有特定的准则或规则,但这取决于问题陈述,并且可以通过应用OOP的概念以多种方式来实现解决方案。

今天就这样。我的思维模型也许正在逐步发展,试图建立编程概念的框架。

明天,我计划结束其余的OOP概念,并进行一些有趣的编码练习,然后再跳入另一个令人兴奋的编程范例。

跟着我们一起学 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天课程-第9天-OOP Pillars

常见问题FAQ

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

发表评论