Python中关于面向对象编程(OOP)基础知识和进阶建议

作者 : IT 大叔 本文共6809个字,预计阅读时间需要18分钟 发布时间: 2020-09-18

面向对象编程(OOP)是一种广泛流行的编程范例,可用于多种不同的语言。这种构造程序的方法使用具有属性和行为的对象。每种编程语言在处理OOP的原理上都有一些不同,因此,对于要学习的每种语言学习OOP至关重要。今天,我们将讨论PythonOOP的基础知识,以将您的Python技能提升到一个新的水平。

无论您是OOP的新手,还是对它在Python中的使用感到好奇,这都是入门的理想之选。您将学习Python中OOP的好处,以及如何在代码中应用OOP概念。到本文结尾,您将能够创建类,初始化对象并将继承应用于Python项目。

今天我们将介绍:

  • 什么是面向对象的编程?
  • Python中的OOP
  • 如何在Python中定义一个类
  • 如何在Python中创建对象
  • 如何在Python中创建实例方法
  • 如何在Python中使用继承
  • 放在一起:计算器问题

什么是面向对象的编程?

面向对象编程是一种编程范式,它基于可重用的“对象”的创建,这些对象具有可被操作,操纵和捆绑的自身属性和行为。

这些对象将相关数据和行为打包为现实生活中的对象的表示形式。OOP是跨各种流行编程语言(例如Python,C ++和Java)的一种广泛使用的范例。

许多开发人员使用OOP,因为它使您的代码可重用且合乎逻辑,并且使继承更易于实现。它遵循DRY原理,这使程序效率更高。

在OOP中,每个对象都有自己的属性定义。例如,假设我们的对象是一个雇员。这些属性可以是它们的名称,年龄和角色。OOP使建模现实世界中的事物及其之间的关系变得容易。许多初学者更喜欢使用OOP语言,因为它们组织数据的方式非常类似于人脑组织信息的方式。

OOP的四个主要原则是继承封装抽象多态

在了解OOP在Python中的工作方式之前,让我们在OOP的构建块上刷新内存。

物产

Sneaker1对象中的属性字段

属性是描述对象的数据。每个对象都具有可以由程序中的函数访问或操纵的独特属性。将这些视为描述单个对象的变量。

例如,一个sneaker1对象可以具有属性size和 isOnSale

方法

包含属性(顶部)和方法(底部)的sneaker1对象

方法定义对象的行为。方法就像对象范围内的函数一样。它们通常用于更改对象的属性。

例如,我们的sneaker1对象将具有所述方法putOnSale用于切换isOnSale开或关属性。

它们也可以用于报告特定对象的属性。例如,同一sneaker1对象还可以具有一种printInfo向用户显示其属性的方法。

班级

从Shoe类创建的slipneer1对象

每个对象都有一个类创建。可以将其视为某种对象的设计图。类列出了对该对象类型必不可少的属性,但未为其分配值。类还定义了可用于该类型的所有对象的方法。

例如,sneaker1是从Shoe定义我们的属性sizeisOnSale以及方法putOnSale和的类创建的printInfo。从Shoe类蓝图创建的所有对象都将定义相同的字段。

类就像每个对象都属于的伞类。

执行个体

Shoe类的两个实例:sneaker1和sneaker2

对象是其父类的实例,具有唯一的名称和属性值。您可以在一个程序中具有相同类类型的多个实例。程序调用针对单个实例,而类保持不变。

例如,我们的shoe类可以有两个实例sneaker1,用size8,而且sneaker2,用size12。对实例所做的任何更改sneaker1都不会影响sneaker2

Python中的OOP

Python是一种多范式编程语言,这意味着它支持OOP以及其他范式。您可以使用类在Python中实现OOP。Python提供了面向对象编程的所有标准功能。

开发人员通常选择在其Python程序中使用OOP,因为它使代码更易于重用,并且更易于使用大型程序。OOP程序可防止您重复代码,因为一个类只能定义一次并可以多次重用。因此,OOP使实现“不要重复自己”(DRY)原则变得容易。

让我们看一下OOP如何改进Python的示例。假设您使用列表而不是类别来组织数据。

sneaker1 = [8, true, "leather", 60]

在这里,列表sneaker1中包含的属性值sizeisOnSalematerialcost。这种方法不使用OOP,可能会导致一些问题:

  1. 您必须记住他们用来存储某种类型数据的索引,即。sneaker1[0] =大小。这不像的对象调用那样直观sneaker1.size
  2. 不可重用。您必须为每个项目创建一个新列表,而不仅仅是初始化一个新对象。
  3. 难以创建特定于对象的行为。列表不能包含方法。每个列表必须调用相同的全局函数以实现给定的行为,而不是对象特定的方法。

取而代之的是,使用OOP,我们可以将此作为Shoe类对象编写,以避免出现这些问题并使代码更加有用。

sneaker1 = Shoe(8, true, "leather", 60)

为了避免这些问题,Python开发人员通常在其他可用范例上使用OOP。下面我们将探索如何在Python程序中实现OOP。

如何在Python中定义一个类

要在Python中创建一个类,我们使用class关键字和如下属性:

class MyClass:
  x = 4

然后我们使用MyClass创建一个这样的对象:

p1 = MyClass()
print(p1.x)

让我们更深入一点。对于以下示例,假设您被雇为一家鞋店网上商店。我们将学习如何使用Python定义一个Shoe类以及每个鞋子必须在网站上列出的属性。

首先,我们使用class关键字开始我们的课程,然后将其名称设置为Shoe。每个实例Shoe代表一双不同的鞋子。然后,我们列出的属性每只鞋都会有,sizeisOnSalematerial,和price。最后,我们将每个属性设置为value None。初始化Shoe对象时,将设置每个属性值。

class Shoe:
    # define the properties and assign none value
    size = None
    isOnSale= None
    material = None
    price = None

注意:间距

请记住,在一个类中的所有属性或方法之前要包含四个空格,以便Python识别它们都在已定义的类中。

如何在Python中创建对象

现在,我们将看到如何初始化对象并设置属性值以代表每双鞋子。

要创建一个对象,我们必须首先设置我们的初始化方法。初始化程序方法是唯一的,因为它具有预定义的名称__init__,并且没有返回值。从该类创建新对象时,程序将自动调用初始化方法。

初始化方法应接受特殊self参数,然后将所有类属性作为参数。该self参数允许初始化方法选择新创建的对象实例。

然后,我们为每个属性填充一个实例变量初始化的初始化方法。这些初始化中的每一个都将创建的对象的属性设置为相应参数的值。

例如,第一个self.size = sizesize创建的对象的属性设置为等于size在对象创建时传递的参数。

设置初始化程序后,我们可以使用创建对象[objectName] = Shoe()并传递必要的参数。在第10行,我们创建了一个Shoe名为对象sneaker3具有的属性size = 11isOnSale = falsematerial = "leather",和price = 81

我们可以使用此代码创建所需的任意多个实例Shoe

class Shoe:
    # defines the initializer method
    def __init__(self, size, isOnSale, material, price):
        self.size = size
        self.isOnSale = isOnSale
        self.material = material
        self.price = price

# creates an object of the Shoe class and sets 
# each property to an appropriate value
sneaker3 = Shoe(11, 'false', "leather", 81)

如何在Python中创建实例方法

接下来,我们将实例方法添加到我们的Shoe类中,以便我们可以在鞋店程序中与对象属性进行交互。实例方法的主要优点是,Shoe一旦创建任何类型的对象,它们就都可使用。

要创建实例,请调用该类并传递其__init__方法接受的参数。

class Shoe:
    # defines the initializer method
    def __init__(self, size, isOnSale, material, price):
        self.size = size
        self.isOnSale = isOnSale
        self.material = material
        self.price = price

    # Instance method
    def printInfo(self):
        return f" This pair of shoes are size {self.size}, are made of {self.material}, and costs ${self.price}"


   # Instance method
    def putOnSale(self):
        self.isOnSale = true

sneaker3 = Shoe(11, 'false', "leather", 81)

print (sneaker3.printInfo())

我们的第一个实例方法是printInfo列出除以外的所有属性isOnSale。在第10行,我们使用关键字def开始声明一个新方法,然后对该方法命名,printInfo最后列出特殊参数self

在这种情况下,self允许该方法访问调用此方法的对象内的任何参数。然后,我们使用self.[property]调用在第11行上写出消息。

注意:消息中括号中的任何部分均未实际打印,而是为所选对象打印指定属性的值。

我们的第二个实例方法将选定对象内的属性putOnSale值更改isOnSaletrue。在第15行,我们使用关键字def,方法名称和self参数来定义方法。

然后,使用一个语句填充该方法,以将isOnSale属性更改为true第16行。该语句的第一部分选择isOnSale当前所选对象的属性。该语句的第二部分将所选属性的值设置为true

更改此Shoe对象的isOnSale属性的值不会更改Shoe该类内的默认值。Python不需要return每个方法都包含一个值。

如何在Python中使用继承

最后,我们将添加子类别Sandal中的Shoe使用继承类。继承允许新类继承另一个类的属性和行为。继承的类称为父类。从父类继承的任何类都称为子类

子类不仅继承所有属性和方法,还可以扩展或覆盖它们。

扩展是指向子类添加父级中不存在的属性或方法。覆盖是一种在父类中已经定义的子类中重新定义方法的能力。

单类继承的一般语法为:

class BaseClass:
  Base class body
class DerivedClass(BaseClass):
  Derived class body

我们还可以具有多个类继承:

class BaseClass1:
  Base class1 body
class BaseClass:
  Base class2 body
class DerivedClass(BaseClass1,BaseClass2):
  Derived class body

Python中关于面向对象编程(OOP)基础知识和进阶建议插图

Python中关于面向对象编程(OOP)基础知识和进阶建议插图(2)

要在Python中实现继承,请正常定义一个类,但在最后一个冒号之前的括号中添加其父类的名称(第2行)。

#Sandal is the child class to parent class Shoe
class Sandal(Shoe):
    def __init__(self, size, isOnSale, material, price, waterproof):
    #inherit self, size, isOnSale, material, and price properties
       Shoe.__init__(self, size, isOnSale, material, price)
   #expands Sandal to contain additional property waterproof
       self.waterproof = waterproof
 
#overwrites printInfo to reference "pair of sandals" rather than shoes
    def printInfo(self):
        return f" This pair of sandals are size {self.size}, are made of {self.material}, and costs ${self.price}"

sandal1 = Sandal(11, False, "leather", 81, True)
 
print (sandal1.printInfo())

然后,我们定义一个新的初始化方法,该方法从中获取所有属性Shoe并添加一个唯一waterproof属性。

在第3行,我们为父类和子类都需要的所有属性声明了初始化方法。然后在第5行,我们从父Shoe类调用初始化方法来处理共享属性。然后,我们扩展到继承的属性之外,以waterproof在第7行添加该属性。

您可以使用扩展类来减少重写的代码。如果我们的类没有继承自Shoe,我们将需要重新创建整个初始化方法,以使两者之间只有很小的区别。

接下来,我们覆盖printInfo中定义的类ShoeSandal具体的。Python将始终使用方法的最本地定义。

因此,Python将使用新定义的printInfo方法,Sandal在继承printInfo方法从ShoeprintInfo方法被调用。

放在一起:计算器问题

让我们将挑战中学到的技能付诸实践。您的目标是编写一个名为的Python类Calculator应对这一挑战有两个步骤:定义计算器的属性,并为四个操作中的每一个添加方法。

任务1

写一个初始化初始化值num1num2。属性是num1num2

任务2

在程序中添加四种方法:

  • add(),一种返回和的num1和的方法num2
  • subtract(),该方法返回num1num2 的减法。
  • multiply(),它返回的产品的方法num1num2
  • divide(),它返回的划分的方法num2通过num1

您的输入将是对象的属性整数,而您的输出将是这些数字的加法,减法,除法和乘法结果。

# Sample input
 
obj = Calculator(10, 94);
obj.add()
obj.subtract()
obj.multiply()
obj.divide()
 
# Sample output
 
104
84
940
9.4

自行尝试,并检查解决方案是否卡住。祝好运!

class Calculator:
    def __init__(self, num1, num2):
        self.num1 = num1
        self.num2 = num2

    def add(self):
        return (self.num2 + self.num1)

    def subtract(self):
        return (self.num2 - self.num1)

    def multiply(self):
        return (self.num2 * self.num1)

    def divide(self):
        return (self.num2 / self.num1)


demo1 = Calculator(10, 94)
print("Addition:", demo1.add())
print("Subtraction:", demo1.subtract())
print("Mutliplication:", demo1.multiply())
print("Division:", demo1.divide())

解决方案细目

让我们深入研究解决方案。没关系的话也可以!实践是我们学习的方式。

  • 我们首先Calculator使用两个属性实现该类:num1num2
  • 3-4行,我们初始化了属性num1num2
  • 7行,我们实现add(),一种方法,其返回的总和,num1num1,这两种性质的。
  • 第10行,我们实现subtraction()。此方法返回之间的差值num1num2
  • 第13行,我们实现了multiplication(),返回的产品的方法num2num1
  • 第16行,我们实现division()。此方法返回num2by 的商num1

继续前进

现在,您已经完成了对面向对象的Python编程世界的了解。今天,我们细分了面向对象编程的定义,以及为什么它在Python中很流行,并带您了解了Python中面向对象程序的关键部分。

但是,本文介绍的概念仅仅是OOP所能提供的功能。在OOP旅程中要学习的下一个主题是:

  • 数据封装
  • 多态性
  • 聚合
  • 运算符重载
  • 信息隐藏
免责声明:
1. 本站资源转自互联网,源码资源分享仅供交流学习,下载后切勿用于商业用途,否则开发者追究责任与本站无关!
2. 本站使用「署名 4.0 国际」创作协议,可自由转载、引用,但需署名原版权作者且注明文章出处
3. 未登录无法下载,登录使用金币下载所有资源。
IT小站 » Python中关于面向对象编程(OOP)基础知识和进阶建议

常见问题FAQ

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

发表评论