面向对象的三大特征

面向对象的三大特征即继承、封装、多态

1.继承

继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。

通过继承创建的新类称为“子类”或“派生类”。

被继承的类称为“基类”、“父类”或“超类”。

继承的过程,就是从一般到特殊的过程。

优点

  • 提高了代码的复用性
  • 提高了代码的维护性
  • 在类与之间产生了关系,是多态的前提

抽象与重用性

  1. 继承与抽象:抽象即将类相似的部分提取出来, 形成一种统一。
    继承是基于抽象的结果,当面向对象编程的过程中要对类进行抽象, 将抽象的结果形成一个基类, 让其他类去继承这个基类, 使得其他类拥有基类的属性与方法, 减少重复代码的编写与维护.
  2. 继承与重用性:继承的目的有两方面:
        一方面: 提高代码的重用性, 减少冗余代码
        另一方面: 实现接口类, 规范子类, 实现归一化

 继承的实现 

1.子类继承父类

class ClsA(object):
	nest = 'A类'
	
	def func(self):
		pass
	
# 子类ClsB继承与ClsA
# ClsA称为父类(或基类), ClsB称为子类(或派生类)
class ClsB(ClsA):
	pass

2. 子类调用父类的方法

class ClsA(object):
	nest = 'A类'
	
	def func(self):
		print("A类")
	
class ClsB(ClsA):
	pass
b_obj = ClsB()
b_obj.func()

子类ClsB调用父类ClsA中的方法 

3.子类重写父类方法

class ClsA(object):
	nest = 'A类'
	
	def func(self):
		print("A类")
	
class ClsB(ClsA):
	# 定义与父类同名的方法
	def func(self):
		print(111)
b_obj = ClsB()
b_obj.func()

4.多继承的实现

 多继承: 一个类继承多个类时就产生了多继承

class A(object):
	pass
	
class B(object):
	pass
	
# C类继承了A类与B类, 此为多继承
class C(A, B):
	pass

5.mro顺序 

 mro顺序是指一个类产生多继承时, 调用一个方法或属性时在其所有父类中的搜索顺序, 可以通过`类名.__mro__`获取其搜索顺序

2.封装

将描述事物的数据和操作封装在一起,形成一个类;被封装的数据和操作只有通过提供的公共方法才能被外界访问,私有属性和方法是无法被访问的,增加数据的安全性。

封装的优势

  1. 减少代码冗余
  2. 将变化隔离
  3. 便于使用
  4. 提高复用性
  5. 提高安全性

 私有属性与私有方法 

1. 私有属性在python中用双下划线开头的方式将属性隐藏起来(设置成私有的)

class A(object):
    __n = 123

    def func(self):
        pass

a = A()
print(a.__n)    # 由于__n是A类的私有方法, 所以对象不能直接获取该属性
print(a._A__n)  # 此种方式可以获取A类的私有属性

 2. 私有方法: 在继承中,父类如果不想让子类覆盖自己的方法,可以将方法定义为私有的

# 将fa定义成私有方法,即__func
    class A:
        def __func(self): # 在定义时就变形为_A__func
            print('from A')
        def test(self):
            self.__func() # 只会与自己所在的类为准,即调用_A__func

property, classmethod, staticmethod​属性

1.property

property属性: property是一种特殊的属性,访问它时会执行一段功能(函数)然后返回值property属性有两种方法: @property装饰器 和 property()函数

@property装饰器: @property装饰器就是负责把一个方法变成属性调用的

# @property装饰器将score方法变成属性,可以通过s.score来获得
@property 
def score(self):
    print("getting score")
return self._score

s = Student(60)
s.score

 2. classmethod

classmethod修饰符对应的函数不需要实例化,不需要 self 参数,但第一个参数需要是表示自身类的 cls 参数,可以来调用类的属性,类的方法,实例化对象等

class A(object):
    bar = 1
    def func1(self):
        print ('foo')

    @classmethod
    def func2(cls):
        print ('func2')
        print (cls.bar)
        cls().func1() # 调用 foo 方法

A.func2()  # 不需要实例化

 3.staticmethod

staticmethod返回函数的静态方法,staticmethod声明的静态方法,可以实例化调用静态方法,也可以不实例化调用该静态方法

语法:staticmethod(function)

class C(object):
    @staticmethod
    def func():
        print('runoob')


C.func()	# 静态方法无需实例化
cobj = C()
cobj.func()  # 也可以实例化后调用

3.多态

多态就是一个对象变量可以指向多种实际类型的现象,同一个事件发生在不同的对象上会产生不同的结果。

优点:1.提高了代码的维护性    2.提高了程序的扩展性

缺点:不能访问子类特有功能

运行时的三个条件

1.继承    2.覆盖(重写)    3.向上转型

  • 7
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值