Python 中的面向对象编程?
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() 方法。