跟着我们一起学 Python 30天课程-第8天-OOP基础知识

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

Python是一种多范式语言。这是一个很酷的名词!来自JavaScript世界,我知道这一点,因为JavaScript也是一种多范式语言。

这意味着有多种明确的方式来思考我们如何用Python编写代码,构造代码。现在,为什么这很重要?
在现实世界中,在处理现实项目时,我们尝试通过编程解决的问题很复杂,甚至在编写一行代码之前就需要进行大量的头脑风暴。
优秀的程序员不仅考虑如何用代码解决问题,而且考虑如何编写易于维护在必要时易于扩展,以及易于读写的代码
这种构造和组织代码的方式称为编程范例。
这就像具有一些预定义规则集的模式,开发人员可以遵循这些规则以避免混乱。想象一下,如果每个开发人员都试图以独特的方式精明地编写代码。
没有明确的模式,该项目将注定要失败!

回到Python!

在Python中,一切都是Object。我探索的数据类型都是具有自己关联属性和方法以执行某些操作的所有对象。这些对象作为实例来自其类。
这意味着Python中的所有数据类型都具有定义的结构或原型,其中已定义了其属性和功能的所有详细信息。

print(type(2)) # <class 'int'>
print(type(2.5)) # <class 'float'>
print(type('Python')) # <class 'str'>
print(type(True)) # <class 'bool'>
print(type({})) # <class 'dict'>
print(type([])) # <class 'list'>
print(type(())) # <class 'tuple'>
print(type(None)) # <class 'NoneType'>

就像内置类一样,可以创建自定义类来表示现实世界中的事物,例如汽车,机器,人类,动物或其他任何事物。
现实世界中的实体及其属性和行为在代码类中的这种表示形式可以被认为是面向对象编程范式的宽松定义。
然后可以使用每个类来创建对象的实例。这些对象可以与其他对象组合以模拟实际功能。

在JavaScript世界中,也可以创建自定义类(尽管JS中的类在ES6引入的原型函数之上更多是语法糖)。因此,在我的心理模型中,我假设将它们连接起来。

但是要在Python中看到OOP的实际效果,必须深入研究并编写一些代码。

class Avenger:
  def __init__(self, name):
    self.name = name

  def fight(self):
    print('👊')

spiderman = Avenger('Spiderman')

print(type(Avenger)) # <class 'type'>
print(type(spiderman)) # <class '__main__.Avenger'> --> instance of Avenger

在Python中,类的命名约定为驼峰式和单数名称,这与需要使用蛇形的变量不同。

__init__是一个初始化方法(也称为构造函数方法)。它用于初始化类的变量。在上面的类中,名称正在初始化。
例如,在JavaScript中,类似地在类的构造函数中完成此操作。

self是Python中的关键字,它是对该类实例的引用。它用于访问类的变量或属性。在我的思维模型中,我将此与JavaScript this关键字进行了比较。

在“ 复仇者联盟”课程中,战斗是一种方法,它是复仇者在被要求打架时会做什么的假设表示。在这里,它只是打印一个表情符号,但是可以是任何动作。
使用这个Avenger类作为原型,我创建了一个Spiderman对象。同样,该类可用于创建其他复仇者,但似乎每个人都会在要求他们打架上做同样的事情,这很酷。

class Avenger:
  def __init__(self, name, weapon):
    self.name = name
    self.weapon = weapon

  def fight(self):
    print(self.weapon)

spiderman = Avenger('Spiderman', 'dispatch a web')
thor = Avenger('Thor', 'thunder attack')

spiderman.fight() # dispatch a web
thor.fight() # thunder attack

现在更好了。每个复仇者都有独特的表现!这是该类的基本框架,可以填充很多功能,以使复仇者更加复杂。

__init_这就是所谓的构造方法被调用时每个对象被实例化(创建)的时间。
它还提供了很多控制机制,例如仅在满足条件时才允许对象创建或向参数添加默认值。

class MotorBike:
  def __init__(self, brand, age):
    if(age <= 15):
      self.brand = brand
      self.age = age

  def start(self):
    print(f'starting {self.brand}....')

bullet = MotorBike('Royal Enfield Bullet',20)
bullet.start() # error. object is created only if age is less than or equals 15

编码练习

任务是创建一个具有名称目标属性的SoccerPlayer类,然后创建3个玩家对象,然后使用一个函数找出最大目标并进行打印。

class SoccerPlayer:
  def __init__(self, name, goals):
    self.name = name
    self.goals = goals


def calculateMaxGoals(*args):
  print(args)
  return max(*args)

messi = SoccerPlayer('messi', 10)
ronaldo = SoccerPlayer('ronaldo',22)
neymar = SoccerPlayer('neymar', 8)

max_goals = calculateMaxGoals(messi.goals, ronaldo.goals, neymar.goals)
print(f'The highest number of goals is {max_goals} goals')

@classmethod和@staticmethod

可以将方法附加到类上,而无需创建它的实例。有两种方法可以这样做。

  • @classmethod通过在方法名称的顶部添加所谓的装饰器 @classmethod,可以在类中创建方法。稍后,我将详细介绍装饰器,但到目前为止,仅大致了解创建类方法的概念。
class Calculator:
  def __init__(self,type):
    self.type = type

  @classmethod
  def calculate_sum(cls, num1, num2): 
        return num1 + num2
    # cls is just like self which needs to passed as 1st parameter

print(Calculator.calculate_sum(3,5)) # 8
  • @staticmethod与...非常相似@classmethod。它只是不需要传递cls关键字。可以在不实例化类的情况下调用此方法。
class Calculator:
  def __init__(self,type):
    self.type = type

  @staticmethod
  def multiply(num1, num2): 
        return num1 * num2
    # cls is just like self which needs to passed as 1st parameter

print(Calculator.multiply(3,5)) # 15

今天就这样。我将详细介绍和探索面向对象编程的原理,并在理解概念的过程中进行一些练习。心理模型正在逐步稳定地发展,以解决未来几天中更高级的话题。
希望您也发现它有趣。

跟着我们一起学 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天课程-第8天-OOP基础知识

常见问题FAQ

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

发表评论