Python中的面向对象编程?

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

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

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

在Python中定义一个类

让我们只定义一个空类。

#Define a class
class Vehicle():
   pass # An empty block

# Instantiating objects
v = Vehicle()
print(v)

结果

<__main__.Vehicle object at 0x055DB9F0>

我们在上面做了什么?

因此,首先,我们使用类语句创建新的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。这意味着当我们从该类创建对象时,该对象本身将通过该方法。

通常,在调用函数时我们不提供任何参数(自身),但是无论何时我们在该类中定义该函数时,都必须提供参数(自身)。

让我们通过示例来了解以上概念。

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中的Init构造函数

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

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

  • 参数化构造函数

  • 非参数构造函数

在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)时,我们传递了名称参数,构造函数将把该参数分配给实例属性。

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

用Python封装

python本质上是一种技术,它提供了一种限制对方法和变量的访问的方法。

使用数据封装后,我们无法通过在对象上调用属性来直接修改实例属性。它将使我们的应用程序容易受到黑客的攻击。但是,我们仅通过调用特定方法来更改实例属性值。

示例

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

   def sellingPrice(self):
      print('Our product maximum price is: {}'.format(self.__maxprice))
      print('Our product minimum price is: {}'.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()

结果

Our product maximum price is: 1000
Our product minimum price is: 1
Our product maximum price is: 1000
Our product minimum price is: 1
Our product maximum price is: 1000
Our product minimum price is: 1
Our product maximum price is: 1500
Our product minimum price is: 1
Our product maximum price is: 1500
Our product minimum price is: 10

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

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