Python面向对象编程简介

面向对象编程(Object-Oriented Programming,简称OOP)是一种编程范式,它将数据和操作数据的方法(函数)组合成一个单独的单位,称为对象。在Python中,几乎一切都是对象,包括整数、字符串、列表等等。面向对象编程的核心思想是将现实世界中的事物抽象成对象,并通过定义类来描述这些对象的属性和行为。

在Python中,面向对象编程(OOP)是一种在编程中使用对象和类的编程范例。它的目标是在编程中实现继承、多态、封装等现实世界的实体。OOP 的主要概念是将数据和处理该数据的函数绑定为一个单元,以便代码的其他部分无法访问该数据。

Python 中的面向对象编程概念

  • 对象
  • 多态性
  • 封装
  • 遗产
  • 数据抽象

Python类 

类是对象的集合。类包含创建对象的原型。它是一个逻辑实体,包含一些属性和方法。 

为了理解创建类的必要性,让我们考虑一个示例,假设您想要跟踪可能具有不同属性(如品种和年龄)的狗的数量。如果使用列表,第一个元素可以是狗的品种,而第二个元素可以代表它的年龄。假设有 100 只不同的狗,那么你怎么知道哪个元素应该是哪个呢?如果您想为这些狗添加其他属性怎么办?

Python 类的一些要点:

  • 类是通过关键字class 创建的。
  • 属性是属于某个类的变量。
  • 属性始终是公共的,可以使用点 (.) 运算符进行访问。例如:Myclass.Myattribute

类定义语法:

class ClassName:
   # Statement-1
   .
   .
   .
   # Statement-N

在 Python 中创建空类

在上面的示例中,我们使用 class 关键字创建了一个名为 Dog 的类。

# Python3 program to
# demonstrate defining
# a class

class Dog:
	pass

Python 对象

对象是具有与其关联的状态和行为的实体。它可以是任何现实世界的对象,如鼠标、键盘、椅子、桌子、笔等。整数、字符串、浮点数、甚至数组和字典都是对象。更具体地说,任何单个整数或任何单个字符串都是一个对象。数字12是一个对象,字符串“Hello, world”是一个对象,列表是一个可以容纳其他对象的对象,等等。

一个对象由以下部分组成:

  • 状态:用对象的属性来表示。它还反映了对象的属性。
  • 行为:它由对象的方法表示。它还反映了一个对象对其他对象的响应。
  • 身份:它为对象赋予唯一的名称,并使一个对象能够与其他对象交互。

为了理解状态、行为和身份,让我们以狗类为例(如上所述)。 

  • 身份可以被认为是狗的名字。
  • 状态或属性可以被视为狗的品种、年龄或颜色。
  • 该行为可以被认为是狗是在吃东西还是在睡觉。

创建对象

这将创建上面定义的 Dog 类的名为 obj 的对象。在深入研究对象和类之前,让我们了解一些在处理对象和类时将使用的基本关键字。

obj = Dog()

Python类中的self

在Python中,self 是一个特殊的参数,通常作为类方法的第一个参数传递给方法。它表示类的实例(对象)本身。通过使用 self,您可以访问对象的属性和方法,以及修改对象的状态。

Python __init__ 方法 

__init__方法类似于 C++ 和 Java 中的构造函数。一旦类的对象被实例化,它就会运行。该方法对于执行您想要对对象执行的任何初始化非常有用。现在让我们定义一个类并使用 self 和 __init__ 方法创建一些对象。

使用类和实例属性创建类和对象

class Dog:

	# 类属性
	attr1 = "哺乳动物"

	# 实例属性
	def __init__(self, name):
		self.name = name

# 驱动代码
# 创建对象
Rodger = Dog("Rodger")
Tommy = Dog("Tommy")

# 访问类属性
print("Rodger 是一个{}".format(Rodger.__class__.attr1))
print("Tommy 也是一个{}".format(Tommy.__class__.attr1))

# 访问实例属性
print("我的名字是{}".format(Rodger.name))
print("我的名字是{}".format(Tommy.name))

输出:

Rodger 是一个哺乳动物
Tommy 也是一个哺乳动物
我的名字是Rodger
我的名字是Tommy

使用方法创建类和对象

这里,Dog 类定义了两个属性:

  • attr1 是设置为值“哺乳动物”的类属性。类属性由该类的所有实例共享。
  • __init__ 是一个特殊的方法(构造函数),用于初始化 Dog 类的实例。它有两个参数:self(指正在创建的实例)和name(代表狗的名字)。name 参数用于为 Dog 的每个实例分配名称属性。
    talk 方法是在 Dog 类中定义的。此方法打印一个包含狗实例名称的字符串。

代码首先创建 Dog 类的两个实例:Rodger 和 Tommy。为每个实例调用 __init__ 方法,以使用提供的名称初始化其名称属性。在两个实例(Rodger.speak() 和 Tommy.speak())中都调用了 talk 方法,使每只狗都打印一条带有其名称的语句。

class Dog:

	# 类属性
	attr1 = "哺乳动物"

	# 实例属性
	def __init__(self, name):
		self.name = name

	def speak(self):
		print("我的名字是{}".format(self.name))

# 驱动代码
# 创建对象
Rodger = Dog("Rodger")
Tommy = Dog("Tommy")

# 访问类方法
Rodger.speak()
Tommy.speak()

输出:

我的名字是Rodger
我的名字是Tommy

Python继承

继承是一个类从另一个类派生或继承属性的能力。派生属性的类称为派生类或子类,派生属性的类称为基类或父类。继承的好处是:

  • 它很好地代表了现实世界的关系。
  • 它提供了代码的可重用性。我们不必一次又一次地编写相同的代码。此外,它允许我们在不修改类的情况下向类添加更多功能。
  • 它本质上是传递性的,这意味着如果B类继承自另一个类A,那么B的所有子类都会自动继承自A类。

继承的类型

  • 单继承:单级继承使派生类能够继承单父类的特征。
  • 多级继承:多级继承使派生类能够从直接父类继承属性,而直接父类又从其父类继承属性。 
  • 分层继承:分层继承允许多个派生类从父类继承属性。
  • 多重继承:多级继承使一个派生类可以从多个基类继承属性。

Python 中的继承

在下面的代码中,我们创建了两个类,即Person(父类)和Employee(子类)。Employee 类继承自 Person 类。我们可以通过employee类使用person类的方法,如上面代码中的显示函数所示。子类还可以通过details() 方法修改父类的行为。

# 父类
class Person(object):

	# __init__ 被称为构造函数
	def __init__(self, name, idnumber):
		self.name = name
		self.idnumber = idnumber

	def display(self):
		print(self.name)
		print(self.idnumber)
		
	def details(self):
		print("我的名字是{}".format(self.name))
		print("Id号码: {}".format(self.idnumber))
	
# 子类
class Employee(Person):
	def __init__(self, name, idnumber, salary, post):
		self.salary = salary
		self.post = post

		# 调用父类的 __init__
		Person.__init__(self, name, idnumber)
		
	def details(self):
		print("我的名字是{}".format(self.name))
		print("Id号码: {}".format(self.idnumber))
		print("职位: {}".format(self.post))


# 创建对象变量或实例
a = Employee('Rahul', 886012, 200000, "实习生")

# 使用类 Person 的实例调用函数
a.display()
a.details()

输出:

Rahul
886012
我的名字是Rahul
Id号码: 886012
职位: 实习生

Python多态性

多态性简单地意味着具有多种形式。例如,我们需要确定给定种类的鸟类是否会飞,使用多态性我们可以使用单个函数来完成此操作。

Python 中的多态性

此代码演示了 Python 类中继承和方法重写的概念。它展示了子类如何覆盖其父类中定义的方法以提供特定行为,同时仍然从父类继承其他方法。

class Bird:

	def intro(self):
		print("有许多种类的鸟类。")

	def flight(self):
		print("大多数鸟类能够飞行,但有些不能。")

class Sparrow(Bird):

	def flight(self):
		print("麻雀能够飞行。")

class Ostrich(Bird):

	def flight(self):
		print("鸵鸟不能飞行。")

obj_bird = Bird()
obj_spr = Sparrow()
obj_ost = Ostrich()

obj_bird.intro()
obj_bird.flight()

obj_spr.intro()
obj_spr.flight()

obj_ost.intro()
obj_ost.flight()

输出:

有许多种类的鸟类。
大多数鸟类能够飞行,但有些不能。
有许多种类的鸟类。
麻雀能够飞行。
有许多种类的鸟类。
鸵鸟不能飞行。

Python封装

封装是面向对象编程(OOP)的基本概念之一。它描述了包装数据的思想以及在一个单元内处理数据的方法。这对直接访问变量和方法施加了限制,并且可以防止数据的意外修改。为了防止意外更改,对象的变量只能通过对象的方法进行更改。这些类型的变量称为私有变量。

类是封装的一个例子,因为它封装了成员函数、变量等所有数据。

Python 中的封装

在下面的示例中,我们创建了 c 变量作为私有属性。我们甚至无法直接访问该属性,甚至无法更改其值。

# Python程序演示私有成员

# 创建一个基类
class Base:
	def __init__(self):
		self.a = "JkhxwforGeeks"
		self.__c = "JkhxwforGeeks"

# 创建一个派生类
class Derived(Base):
	def __init__(self):

		# 调用基类的构造函数
		Base.__init__(self)
		print("调用基类的公共成员: ")
		print(self.a)  # 访问公共成员

# 主程序
obj1 = Base()
print(obj1.a)

# 取消注释print(obj1.__c)将引发AttributeError

obj2 = Derived()  # 这将正常工作

输出:

JkhxwforGeeks
调用基类的公共成员:
JkhxwforGeeks

数据抽象 

它向用户隐藏了不必要的代码细节。此外,当我们不想泄露代码实现的敏感部分时,这就是数据抽象的来源。

Python中的数据抽象可以通过创建抽象类来实现。

为什么我们需要面向对象编程

  • 让项目的开发和维护更加省力。 
  • 提供数据隐藏功能,有利于安全问题。  
  • 如果我们使用面向对象编程,我们就可以解决现实世界的问题。 
  • 它确保了代码的可重用性。 
  • 它让我们可以编写通用代码:它将处理一系列数据,因此我们不必一遍又一遍地编写基本内容。

原创文章,作者:jkhxw,如若转载,请注明出处:https://www.jkhxw.com/python-oops-concepts/

(0)
上一篇 2023年9月25日
下一篇 2023年9月25日

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注