Python 中的面向对象编程?

pythonserver side programmingprogramming更新于 2023/11/1 6:03:00

Python 自诞生以来就是一种面向对象的编程语言。类和对象是面向对象编程的两个主要构建块。

类创建一种新类型的对象,其中对象是类的实例。

让我们创建一个最简单的类,

在 Python 中定义一个类

让我们定义一个空类。

#定义一个类
class Vehicle():
   pass # 一个空块

# 实例化对象
v = Vehicle()
print(v)

结果

<__main__.Vehicle object at 0x055DB9F0>

我们上面做了什么?

因此,首先,我们使用 class 语句创建新的 Vehicle 类,后面跟着一个缩进的语句块,构成类的主体。在我们的例子中,我们有一个空块,使用 pass 语句指示。

接下来,为了使用 Vehicle 类,我们使用类的名称后跟一对括号创建了此类的对象/实例。然后,为了确认对象已创建,我们只需打印它并获取信息,即我们在 __main__ 模块中有一个 Vehicle 类的实例。

Object(v) 是类的一个实例。每个特定对象都是特定类的一个实例。我们可以创建任意数量的类实例,并包含类方法和属性。

类中定义的所有方法和变量都可供其对象访问。

在类中定义方法

class Vehicle():
   def car(self):
      color = 'Red'
      return color

v = Vehicle()
print(v.car())
print(v)

结果

Red
<__main__.Vehicle object at 0x05A59690>

实例方法

在 Python 中,当我们在类中定义任何方法时,我们需要为任何实例方法提供一个默认参数,即 self。这意味着当我们从该类创建一个对象时,该对象本身将传入该方法。

一般来说,我们在调用函数时不提供任何参数(self),但每当我们在该类中定义该函数时,参数(self)是必须的。

让我们使用示例来理解上述概念。

class myClass():
   def myMethod(self):
      return 'Hello'

myInstance = myClass()
print(myInstance.myMethod())

结果

Hello

因此,在上面的程序中,我们定义了一个类 myClass,并在其中定义了一个方法 myMethod(),并只传递一个名为 self 的参数。

但是,当我们通过类的实例调用该方法时,我们没有为其提供任何参数。这是因为每当我们在实例上调用该方法时,第一个参数本身就是一个类的实例。

让我们修改上面程序中的一行-

def myMethod():

我只是从我的方法 (myMethod()) 中删除了参数 (self)。现在让我们再次运行该程序,看看发生了什么。

================ RESTART: C:\Python\Python361\oops_python.py ================
Traceback (most recent call last):
File "C:\Python\Python361\oops_python.py", line 18, in <module>
print(myInstance.myMethod())
TypeError: myMethod() takes 0 positional arguments but 1 was given

因此,该方法的第一个参数必须是 self。

实例属性

这些是特定于对象的属性,定义为 __init__ 方法的参数。每个对象可以有不同的值。

考虑以下示例,

import random

class myClass():
def myMethod(self):
self.attrib1 = random.randint(1, 11)
self.attrib2 = random.randint(1,21)

myInst = myClass()
myInst.myMethod()

print(myInst.attrib1)
print(myInst.attrib2)

结果

2
18

在上面的程序中,"attrib1"和“attrib2”是实例属性。

Python 中的初始化构造函数

构造函数是一种特殊类型的方法,用于初始化类的实例成员。

构造函数可以有两种类型−

  • 参数化构造函数
  • 非参数化构造函数

在 Python 中,"__init__"是与每个 Python 类相关联的唯一方法。

Python 会自动为从类创建的每个对象调用该方法。其目的是使用用户提供的值初始化类属性。

在面向对象编程中,它被称为构造函数。

class Employee:
   def __init__(self, name):
      self.name = name
   
   def display(self):
      print("The name of the employee is: ", self.name)
obj1 = Employee('Zack')
obj2 = Employee('Rajesh')
obj3 = Employee('Tashleem')

obj3.display()
obj1.display()

结果

The name of the employee is: Tashleem
The name of the employee is: Zack

在上面的程序中,当我们创建一个实例(obj1 & obj2)时,我们传递 name 参数,构造函数会将该参数分配给实例属性。

因此,当我们在特定实例上调用 display 方法时,我们将获得特定的名称。

Python 中的封装

由于 Python 本质上是面向对象的,它提供了一种限制对方法和变量的访问的方法。

有了数据封装,我们就不能通过调用对象上的属性来直接修改实例属性。这将使我们的应用程序容易受到黑客攻击。但是,我们只能通过调用特定方法来更改实例属性值。

示例

class Product:
   def __init__(self):
      self.__maxprice = 1000
      self.__minprice = 1

   def sellingPrice(self):
      print('我们的产品最高价格是:{}'.format(self.__maxprice))
      print('我们的产品最低价格是:{}'.format(self.__minprice))

   def productMaxPrice(self, price):
      self.__maxprice = price

def productMinPrice(self, price):
self.__minprice = price

prod1= Product()
prod1.sellingPrice()

prod1.__maxprice = 1500
prod1.sellingPrice()

prod1.__minprice = 10
prod1.sellingPrice()

prod1.productMaxPrice(1500)
prod1.sellingPrice()

prod1.productMinPrice(10)
prod1.sellingPrice()

结果

我们的产品最高价格是:1000
我们的产品最低价格是:1
我们的产品最高价格是:1000
我们的产品最低价格是:1
我们的产品最高价格是:1000
我们的产品最低价格是:1
我们的产品最高价格是:1000
我们的产品最低价格是:1
我们的产品最高价格是: 1500
我们的产品最低价格是:1
我们的产品最高价格是:1500
我们的产品最低价格是:10

在上面的程序中,我们创建了 Product 类的一个实例,并尝试修改实例变量的值,但它仍然给出了构造函数中设置的值。

修改实例属性值的唯一方法是调用 productMaxPrice() 或 productMinPrice() 方法。


相关文章