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()方法。