Python面向对象基本概述


对象

我们可以通过以下几点来描述对象
  • 它们表示所开发的应用程序内的实体
  • 实体之间可以通过交互来解决现实世界的问题
  • 例如,Person是实体,而Car也是实体。Person可以驾驶Car,从一个地方开到另一个地方

类可以帮助开发人员表现现实世界中的主体
  • 类可以定义对象的属性和行为。属性是数据成员,行为由成员函数表示。
  • 类包含了构造函数,这些函数的作用是为对象提供初始状态。
  • 类就像模版一样,非常易于重复复用。
例如,类Person可以带有属性name和age,同时提供成员函数gotoOffice(),以定义去办公室工作的行为。

方法

以下几点描述了方法在面向对象中的作用。
  • 它们表示对象的行为
  • 方法可以对属性进行处理,从而实现所需的功能。
下面是python中的一个列子
class Person(object):

  def __init__(self,name,age):
      self.name = name
      self.age = age

  def get_person(self):
      return "<Person (%s , %s)>"%(self.name,self.age)

p = Person("John",32)
print("Type :",type(p),"内存ID:",id(p))
运行示列如下:

在这里插入图片描述

面向对象编程的主要概念:

封装

  1. 对象的行为对于外部世界来说是不可见的,或者说对象的状态信息是私密的。
  2. 客户端不能通过直接操作来改变对着的内部状态。相反,客户端需要通过发送信息来请求对象来改变其内部状态。对象可以根据请求的类型,通过特定的成员函数(例如 GET 或 POST)改变他们的内部状态,以作出相应的相应。
  3. 在Python中,封装(数据和方法隐藏)的概念不是隐式的,因为它没有提供封装的关键字,例如public,private,protected(在诸如C++或Java之类的语言中,都提供了这些关键字)。当然,如果在变量或函数名前加前缀__,可以将其访问属性变为私有。

多态

多态的特性主要如下:
  • 多态有俩种类型。
    • 对象根据输入参数提供方法不同的实现。
    • 不同类型的对象可以使用相同的借口。
  • 对于Python来说 多态是该语言的内置功能。例如:操作符"+"可以应用于俩个整数进行加法运算,也可以应用于字符串来链接它们。在下面的示列中,字符串,元祖或列表都可以通过整数索引来访问。
它为我们展示了Python内置类型的多态:
a = "John"
b = (1,2,3)
c = [3,4,5,6]
print(a[1],b[0],c[2])


继承

以下几点有助于我们更好地理解继承过程
  • 继承表示一个类可以继承父类的(大部分)功能。
  • 继承被描述为一个重用基类中定义的功能并允许对原始软件的实现进行独立扩展的选项。
  • 继承可以利用不同类的对象之间的关系建立层次结构。与Java不同,而Python支持多重继承(继承多个基类).
在下面的代码示列中,类A是基类,类B继承了类A的特性。因此,类B的对象可以访问类A的方法:
class A:
	def a1(self):
		print("a1")
class B(A):
	def b(self):
		print("b")

b = B()
a.a1()

抽象

抽象的主要特征如下所示:
  • 它提供了一个简单的客户端接口,客户端可以通过该接口与类的对象进行交互,并可以调用该接口中定义的各个方法。
  • 它将内部类的复杂性抽象为一个接口,这样的客户端就不需要知道内部实现了。
在下面的列子中,我们通过add()方法对类Adder的内部细节进行了抽象处理:
class Adder:
	def __init__(self):
		self.sum = 0
	def add(self,value):
		self.sum += value
acc = Adder()
for i in range(99):
	acc.add(i)

print(acc.sum)

组合

组合是指以下几点
  • 它是一种将对象或类组合成更复杂的数据结构或软件实现的方法。
  • 在组合中,一个对象可用于调用其他模块中的成员函数,这样一来,无需通过继承就可以实现基本功能的跨模块使用。
在下面的示列中,类A的对象被组合到类B中:
class A(object):
	def a1(self):
		print("a1")
class B(object):
	def a2(self):
		print("b")
		a().a1()

objectB = B()
objectB.b()

面向对象的设计原则

开放封闭原则

开发/封闭原则规定,类或者对象及其方法对于扩展来说,应该是开放的,但是对于修改来说,应该是封闭的。
简单来说,这意味着当你开发软件应用的时候,一定确保以通用的方式来编写类或者模块,以便每当需要扩展类或者对象行为的时候不必修改类本身。相反,类的简单扩展将有助于新的行为。
例如,开放/封闭原则能够在下列情形中表现得淋漓尽致:为了实现所需行为,用户必须通过扩展抽象基类来创建类的实现,而不是通过修改抽象类。
本设计原则的优点如下:
- 现有的类不会被修改,因此退化的可能性较小。
- 它还有助于保持以前代码的向后兼容性。

控制反转原则

控制反转是指,高层级的模块不应该依赖于低层级的模块,它们应该都依赖于抽象。细节应该依赖于抽象,而不是抽象依赖于细节。
该原则建议任何俩个模块都不应该以紧密方式相互依赖。事实上,基本模块和从属模块应当在它们之间提供一个抽象层来耦合。这个原则还建议,类的细节应该描绘抽象。在某些情况下,这种观念会反转,也就是实现细节本身决定了抽象,这种情况是应该避免的。
控制反转原则的优点如下。
  • 消除了模块间的紧耦合,因此消除了系统中的复杂性/刚性。
  • 由于依赖模块之间有一个明确的抽象层(由钩子或者参数提供),因此便于通过更好的方式处理模块之间的依赖关系。

接口隔离原则

接口隔离原则规定,客户端不应该依赖于它们不需要使用的接口。
接口隔离原则的意思就是,软件开发人员应该仔细地处理接口。例如,它提醒开发人员/架构师开发的方法要与特定的功能紧紧相关。如果存在与接口无关的方法,那么依赖于该接口的类就必须实现它,实际上这是毫无必要的。
例如,一个Pizza接口不应该提供名为add_chicken()方法。基于接口的Veg Pizza不应该强势实现该方法。
本实际原则的优点如下所示。
  • 它强制开发人员编写"瘦身型"接口,并使用方法与接口紧紧相关。
  • 放置向接口中随意添加方法。

单一职责原则

单一职责的含义是:类的职责单一,引起类变化的原因单一。
这个原则是说,当我们开发类时,它应该为特定的功能服务。如果一个类实现了俩个功能,那么最好将它们分开。也就是说,功能才是改变的理由。例如,一个类可以因为所需行为的变化而进行修改,但是如果一个类由于俩个因素(基本上是俩个功能的改变)而改变,那么该类就应该进行相应的分割。
本设计原则的优点如下:
  • 每当一个功能发生变化时,除了特定的类需要改变外,其他类无需变动。
  • 此外,如果一个类有多种功能,那么依赖它的类必定会由于多种原因而经历多次修改,这是应该避免的。

替换原则

替换原则规定,派生类必须能够完全取代基类。
这个原则很简单,当应用程序开发人员编写派生类时,该原则的含义就是他们应该扩展基类。此外,它还建议派生类应尽可能对基类封闭,以至于派生类本身可以替换基本而无需修改任何代码。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值