当前位置: 首页 > 后端技术 > Python

面向对象的Python编程,你需要知道这些!

时间:2023-03-25 20:03:33 Python

总结:Python没有像java中的“private”那样的访问说明符。除了强大的封装外,它还支持大多数与“面向对象”编程语言相关的术语。所以它不是完全面向对象的。本文分享自华为云社区《从零开始学python | 面向对象编程 Python:你需要知道的一切》,原作者:雨川。面向对象编程作为一门学科在开发人员中得到了广泛的关注。Python是一种流行的编程语言,它也遵循面向对象的编程范式。它处理支持OOP概念的Python类和对象的声明。这篇关于“Python中的面向对象编程”的文章将带您了解如何声明Python类、从中实例化对象以及OOP的四种方式。什么是面向对象编程?(Python中的OOP概念)面向对象编程是一种计算机编程风格,它使用“对象”的思想来表示数据和方法。它也是一种创建干净和可重用代码而不是冗余代码的方法。程序被分成独立的对象或若干个小程序。每个单独的对象代表应用程序的不同部分,具有自己的逻辑和数据以在它们内部进行通信。现在,为了更清楚地说明为什么我们使用oops而不是pop,我在下面列出了不同之处。面向对象编程和过程编程之间的区别这就是所有的区别,继续,让我们来看看PythonOOPsConceots。什么是PythonOOP概念?Python中的主要OOP(面向对象编程)概念包括类、对象、方法、继承、多态、数据抽象和封装。这就是所有的区别,让我们继续理解类和对象。什么是类和对象?类是对象的集合,或者您可以说它是定义公共属性和行为的对象的蓝图。现在的问题是,你是怎么做到的?好吧,它以一种使代码可重用性变得容易的方式在逻辑上对数据进行分组。我可以给你一个现实生活中的例子——想象一个办公室,将“员工”想象成一个类,以及与之相关的所有属性,如“emp_name”、“emp_age”、“emp_salary”、“emp_id”作为Python中的对象。下面我们从编码的角度来看一下如何实例化一个类和一个对象。类是在“class”关键字下定义的。示例:classclass1()://class1是类的名称注意:Python不区分大小写。对象:对象是类的实例。它是一个具有状态和行为的实体。简而言之,它是一个可以访问数据的类的实例。语法:obj=class1()其中obj是class1的“对象”。在Python中创建对象和类:示例:classemployee():def__init__(self,name,age,id,salary)://创建函数self.name=name//self是类self的一个实例。age=ageself.salary=salaryself.id=idemp1=employee("harshit",22,1000,1234)//创建对象semp2=employee("arjun",23,2000,2234)print(emp1.__dict__)//打印字典描述:'emp1'和'emp2'是为类'employee'实例化的对象。在这里,单词(__dict__)是一个“字典”,它根据给定的参数(姓名、年龄、薪水)打印出对象'emp1'的所有值。(__init__)就像一个构造函数,每当创建对象时都会调用它。现在我希望你以后在处理“类”和“对象”时不会有任何问题。顺便说一句,让我带您了解面向对象编程:面向对象编程:面向对象编程涉及以下概念。InheritancePolymorphismEncapsulationAbstraction让我们仔细看看继承的第一个概念。遗传:曾经听亲戚说过“你长得像你爸爸/妈妈”,这背后的原因就叫做“遗传”。从编程的角度看,一般是指“将父类的特性不作任何修改地继承或传递给子类”。新类称为派生类/子类,从它派生的类称为父类/基类。让我们详细了解每个子主题。单继承:单级继承使派生类能够从单个父类继承特性。示例:classemployee1()://Thisisaparentclassdef__init__(self,name,age,salary):self.name=nameself.age=ageself.salary=salaryclasschildemployee(employee1)://Thisisachildclassdef__init__(self,name,age,salary,id):self.name=nameself.age=ageself.salary=salaryself.id=idemp1=employee1('harshit',22,1000)print(emp1.age)输出:22说明:我正在使用父类并创建一个构造函数(__init__),该类本身正在使用参数('name'、'age'和'salary')初始化属性。创建子类“childemployee”,继承父类的属性,最后根据参数实例化对象“emp1”和“emp2”。最后,我打印了emp1的年龄。好吧,您可以做很多事情,例如打印整本词典或姓名或薪水。多级继承:多级继承使派生类能够从直接父类继承属性,而直接父类又从其父类继承属性。示例:classemployee()://Superclassdef__init__(self,name,age,salary):self.name=nameself.age=ageself.salary=salaryclasschildemployee1(employee)://Firstchildclassdef__init__(self,name,age,salary):self.name=nameself.age=ageself.salary=salaryclasschildemployee2(childemployee1)://二子classdef__init__(self,name,age,salary):self.name=nameself.age=ageself.salary=salaryemp1=employee('harshit',22,1000)emp2=childemployee1('arjun',23,2000)print(emp1.age)print(emp2.??age)输出:22,23解释:代码上面写的已经解释清楚了,这里我定义超类为employee,子类为childemployee1。现在,childemployee1充当childemployee2的父级。我已经实例化了两个对象“emp1”和“emp2”,其中我从超类“employee”和“name”,“age,salary”和“id”,“salary”“来自父类“childemployee1”层次继承:层次继承使多个派生类可以从一个父类继承属性。例子:classemployee():def__init__(self,name,age,salary)://层次继承self.name=nameself.age=ageself.salary=salaryclasschildemployee1(employee):def__init__(self,name,age,薪水):self.name=nameself.age=ageself.salary=salaryclasschildemployee2(employee):def__init__(self,name,age,salary):self.name=nameself.age=ageself.salary=salaryemp1=employee('harshit',22,1000)emp2=employee('arjun',23,2000)print(emp1.age)print(emp2.??age)输出:22,23解释:在上面的例子中,你可以清楚地看到To有两个子类“childemployee1”和“childemployee2”。它们从共同的父类“Employee”继承功能。对象“emp1”和“emp2”使用参数“name”、“age”、“salary”进行实例化。多重继承:多级继承使派生类能够从多个基类继承属性。例子:classemployee1()://Parentclassdef__init__(self,name,age,salary):self.name=nameself.age=ageself.salary=salaryclassemployee2()://Parentclassdef__init__(self,name,age,salary,id):self.name=nameself.age=ageself.salary=salaryself.id=idclasschildemployee(employee1,employee2):def__init__(self,name,age,salary,id):self.name=nameself.age=ageself.salary=salaryself.id=idemp1=employee1('harshit',22,1000)emp2=employee2('arjun',23,2000,1234)打印(emp1.age)print(emp2.??id)输出:22,1234解释:在上面的例子中,我取了两个父类“employee1”和“employee2”。还有一个子类“childemployee”,它通过根据父类的参数实例化对象“emp1”和“emp2”来继承父类。这都是关于继承的,在面向对象编程Python中继续,让我们深入研究“多态性”。多态性:你一定都用过GPS导航路线,根据交通状况,你会遇到多少条不同的路线到达同一个目的地,从编程的角度来看,这就是所谓的“多态性”。这是一种这样的OOP方法,其中可以以多种不同的方式执行任务。简单来说,它是一个对象的属性,允许它采用多种形式。多态性有两种类型:编译时多态性运行时多态性编译时多态性:编译时多态性也称为静态多态性,在程序编译时解析。一个常见的例子是“方法重载”。让我向您展示一个相同的简单示例。示例:classemployee1():defname(self):print("Harshitishisname")defsalary(self):print("3000ishissalary")defage(self):print("22ishisage")classemployee2():defname(self):print("Rahul是他的名字")defsalary(self):print("4000是他的工资")defage(self):print("23是他的年龄")deffunc(obj)://MethodOverloadingobj.name()obj.salary()obj.age()obj_emp1=employee1()obj_emp2=employee2()func(obj_emp1)func(obj_emp2)输出:HarshitishisName3000是他的薪水22是他的年龄Rahul是他的名字4000是他的薪水23是他的年龄age'创建了该函数并打印了相同的值,但没有从用户那里获取它。现在,欢迎来到主体部分,我创建了一个以“obj”为参数的函数,并调用所有三个函数,即“name”、“age”和“salary”。随后,为这两个类实例化对象emp_1和emp_2,并简单地调用函数。这种类型称为方法重载,它允许一个类具有多个同名方法。RuntimePolymorphism:运行时多态性又称为动态多态性,是在运行时解析的。运行时多态性的一个常见示例是“方法覆盖”。让我举个例子给你看,以便更好地理解。示例:classemployee():def__init__(self,name,age,id,salary):self.name=nameself.age=ageself.salary=salaryself.id=iddefearn(self):passclasschildemployee1(employee):defearn(self)://运行时多态性print("nomoney")classchildemployee2(employee):defearn(self):print("hasmoney")c=childemployee1c.earn(employee)d=childemployee2d.earn(employee)输出:没钱,有钱解释:在上面的例子中,我创建了两个类'childemployee1'和'childemployee2',它们派生自同一个基类'employee'。这是一个收不到钱,另一个收钱的问题。现在真正的问题是这是怎么发生的?好吧,如果你仔细看,我在这里创建了一个空函数并使用了Pass(当你不想执行任何命令或代码时使用的语句)。现在,在两个派生类下,我都使用了相同的空函数,并使用打印语句表示'nomoney'和'hasmoney'。最后,创建两个对象并调用函数。转到下一个面向对象的Python编程方法,我将讨论封装。封装:在其原始形式中,封装基本上意味着将数据绑定到一个类中。与Java不同,Python没有任何私有关键字。不应直接访问类,而应使用下划线作为前缀。让我给你举个例子,以便更好地理解。示例:类员工(对象):def__init__(self):self.name=1234self._age=1234self.__salary=1234object1=employee()print(object1.name)print(object1._age)print(object1.__salary)输出:1234Traceback(最近调用最后一次):1234文件“C:/Users/Harshit_Kant/PycharmProjects/test1/venv/encapsu.py”,第10行,打印(object1.__salary)AttributeError:'employee'对象没有attribute'__salary'解释:你得到这个问题,下划线和错误是什么?好吧,python类将私有变量视为不可直接访问(__salary)。因此,我在下一个示例中使用setter方法,它提供对它们的间接访问。示例:classemployee():def__init__(self):self.__maxearn=1000000defearn(self):print("earningis:{}".format(self.__maxearn))defsetmaxearn(self,earn)://用于访问私有类的setter方法self.__maxearn=earnemp1=employee()emp1.earn()emp1.__maxearn=10000emp1.earn()emp1.setmaxearn(10000)emp1.earn()Output:Earningsare:1000000,Earningsare:1000000,returns:10000说明:使用setter方法提供对私有类方法的间接访问。这里我定义了一个employee类,使用了一个(__maxearn),也就是这里的setter方法,用来存储员工的最大收入,还有一个以价格为参数的setter函数setmaxearn()。这是一个明显的封装示例,我们限制对私有类方法的访问,然后使用setter方法授予访问权限。接下来在面向对象编程中,python方法论讨论了一个称为抽象的关键概念。摘要:假设您使用网上银行或任何其他流程从bookmyshow预订了一张电影票。您不知道如何生成PIN或如何完成验证过程。这在编程术语中称为“抽象”,它基本上意味着您只显示特定过程的实现细节,并对用户隐藏它们。它用于通过建模适合问题的类来简化复杂问题。抽象类不能被实例化,它仅仅意味着你不能创建这类类的对象。它只能用于继承的功能。示例:fromabcimportABC,abstractmethodclassemployee(ABC):defemp_id(self,id,name,age,salary)://Abstractionpassclasschildemployee1(employee):defemp_id(self,id):print("emp_idis12345")emp1=childemployee1()emp1.emp_id(id)输出:emp_idis12345解释:正如你在上面的例子中看到的,我们导入了一个抽象方法,程序的其余部分有一个父类和一个派生类。为“childemployee”基类实例化一个对象并使用抽象功能。Python是100%面向对象的吗?Python没有像java中的“private”这样的访问说明符。除了强大的封装外,它还支持大多数与“面向对象”编程语言相关的术语。所以它不是完全面向对象的。这使我们结束了关于Python中面向对象编程的文章。我希望你已经理解了Python中与类、对象和面向对象概念相关的所有概念。确保你尽可能多地练习和恢复你的经验。点击关注,第一时间了解华为云的新鲜技术~