面向对象的三大特性 鸭子类型 类的约束 super的深度剖析

1.三大特性

封装

? 把很多数据封装到?个对象中. 把固定功能的代码封装到?个代码块, 函数, 对象, 打包成模块. 这都属于封装的思想. 具体的情况具体分析. 比如. 你写了?个很?B的函数. 那这个也可以被称为封装. 在?向对象思想中. 是把?些看似?关紧要的内容组合到?起统?进?存储和使?. 这就是封装.

继承

? ?类可以?动拥有?类中除了私有属性外的其他所有内容. 说?了, ??可以随便?爹的东?. 但是朋友们, ?定要认清楚?个事情. 必须先有爹, 后有??. 顺序不能乱, 在python中实现继承非常简单. 在声明类的时候, 在类名后?添加?个?括号,就可以完成继承关系. 那么什么情况可以使?继承呢? 单纯的从代码层?上来看. 两个类具有相同的功能或者特征的时候. 可以采?继承的形式. 提取?个?类, 这个?类中编写着两个类相同的部分. 然后两个类分别取继承这个类就可以了. 这样写的好处是我们可以避免写很多重复的功能和代码. 如果从语义中去分析的话. 会简单很多. 如果语境中出现了x是?种y. 这时, y是?种泛化的概念. x比y更加具体. 那这时x就是y的?类. 比如. 猫是?种动物. 猫继承动物. 动物能动. 猫也能动. 这时猫在创建的时候就有了动物的"动"这个属性. 再比如, ?骨精是?个妖怪. 妖怪天?就有?个比较不好的功能叫"吃?", ?骨精?出?就知道如何"吃?". 此时 ?骨精继承妖精.

多态

? 同?个对象, 多种形态. 这个在python中其实是很不容易说明?的. 因为我们?直在?. 只是没有具体的说. 比如. 我们创建?个变量a = 10 , 我们知道此时a是整数类型. 但是我们可以通过程序让a = "alex", 这时, a?变成了字符串类型. 这是我们都知道的. 但是, 我要告诉你的是. 这个就是多态性. 同?个变量a可以是多种形态

2.鸭子类型

python中有一句谚语说的好,你看起来像鸭子,那么你就是鸭子。

class A:
    def f1(self):
        print('in A f1')

    def f2(self):
        print('in A f2')

class B:
    def f1(self):
        print('in A f1')

    def f2(self):
        print('in A f2')

obj = A()
obj.f1()
obj.f2()

obj2 = B()
obj2.f1()
obj2.f2()

? A 和 B两个类完全没有耦合性,但是在某种意义上他们却统一了一个标准。

? 对相同的功能设定了相同的名字,这样方便开发,这两个方法就可以互成为鸭子类型。

? 这样的例子比比皆是:str tuple list 都有 index方法,这就是统一了规范。

? str bytes 等等 这就是互称为鸭子类型。

3.类的约束

? 类的约束有两种:

第一种:抛出异常

? 提取?类. 然后在?类中定义好?法. 在这个?法中什么都不??. 就抛?个异常就可以了. 这样所有的?类都必须重写这个?法. 否则. 访问的时候就会报错.

class Payment:
    def pay(self,money):
        raise Exception("子类设置pay方法")

class QQpay(Payment):
    def pay(self,money):
        print(f"QQ支付{money}金额")

class Alipay(Payment):
    def pay(self,money):
        print(f"支付宝支付{money}金额")

class Wechatpay(Payment):
    def zhifu(self,money):
        print(f"微信支付{money}金额")

def pay(obj,money):
    obj.pay(money)

obj1 = QQpay()
pay(obj1,100)

obj2 = Alipay()
pay(obj2,200)

obj3 = Wechatpay()
pay(obj3,300)

"""
QQ支付100金额
Traceback (most recent call last):
支付宝支付200金额
File "D:/pycharm demo/练习/代码练习.py", line 30, in <module>
  pay(obj3,300)
File "D:/pycharm demo/练习/代码练习.py", line 20, in pay
  obj.pay(money)
File "D:/pycharm demo/练习/代码练习.py", line 3, in pay
  raise Exception("子类设置pay方法")
Exception: 子类设置pay方法
"""

第二种:使用元类

? 使?元类来描述?类. 在元类中给出?个抽象?法. 这样?类就不得不给出抽象?法的具体实现. 也可以起到约束的效果.

from abc import ABCMeta,abstractmethod

class Payment(metaclass=ABCMeta):
    @abstractmethod
    def pay(self,money):
        pass

class QQpay(Payment):
    def pay(self,money):
        print(f"QQ支付{money}金额")

class Alipay(Payment):
    def pay(self,money):
        print(f"支付宝支付{money}金额")

class Wechatpay(Payment):
    def zhifu(self,money):
        print(f"微信支付{money}金额")

def pay(obj,money):
    obj.pay(money)

obj1 = QQpay()
pay(obj1,100)

obj2 = Alipay()
pay(obj2,200)

obj3 = Wechatpay()
pay(obj3,300)

"""
QQ支付100金额
Traceback (most recent call last):
支付宝支付200金额
File "D:/pycharm demo/练习/代码练习.py", line 63, in <module>
  obj3 = Wechatpay()
TypeError: Can't instantiate abstract class Wechatpay with abstract methods pay
"""

4.super的深度剖析

class A:
    def f1(self):
        print('in A f1')

    def f2(self):
        print('in A f2')

class Foo(A):
    def f1(self):
        super().f2()
        print('in A Foo')

obj = Foo()
obj.f1()

"""
'in A f2'
'in A Foo'
"""
super可以下一个类的其他方法
class A:
    def f1(self):
        print('in A')

class Foo(A):
    def f1(self):
        super().f1()
        print('in Foo')

class Bar(A):
    def f1(self):
        print('in Bar')

class Info(Foo,Bar):
    def f1(self):
        super().f1()
        print('in Info f1')

obj = Info()
obj.f1()

'''
in Bar
in Foo
in Info f1
'''
print(Info.mro())  # [<class '__main__.Info'>, <class '__main__.Foo'>, <class '__main__.Bar'>, <class '__main__.A'>, <class 'object'>]

super()严格按照类的mro顺序执行
class A:
    def f1(self):
        print('in A')

class Foo(A):
    def f1(self):
        super().f1()
        print('in Foo')

class Bar(A):
    def f1(self):
        print('in Bar')

class Info(Foo,Bar):
    def f1(self):
        super(Foo,self).f1()
        print('in Info f1')

obj = Info()
obj.f1()

"""
in Bar
in Info f1
"""

原文地址:https://www.cnblogs.com/beichen123/p/11316992.html

时间: 2024-10-08 13:33:31

面向对象的三大特性 鸭子类型 类的约束 super的深度剖析的相关文章

Python 面向对象(创建类和对象,面向对象的三大特性是指:封装、继承和多态,多态性)

概念:                                                                                                                                                     ·        面向过程:根据业务逻辑从上到下写垒代码 ·        函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 ·        面向对象:对函数进行分类和封装,

Python 入门 之 面向对象的三大特性(封装 / 继承 / 多态)

Python 入门 之 面向对象的三大特性(封装 / 继承 / 多态) 1.面向对象的三大特性: (1)继承 ? 继承是一种创建新类的方式,在Python中,新建的类可以继承一个或多个父类,父类又可以称为基类或超类,新建的类称为派生类或子类. ? 在Python中实现继承非常简单,在声明类的时候,在类名后面添加一个小括号,就可以完成继承关系.单纯的从代码的层面上来看当两个类具有相同的功能或者特征的时候就可以使用继承.提取一个父类,这个父类中编写者两个类相同的部分,然后两个类分别去继承这个类就可以

面向对象的三大特性

面向对象的三大特性: 封装, 继承, 多态 封装 封装(Encapsulation)是面向对象方法的重要原则,就是把对象的属性和操作(或服务)结合为一个独立的整体,并尽可能隐藏对象的内部实现细节 继承: 子类拥有父类的属性和方法, 任何一个类都继承 Object (不管是java定义的还是自己定义的)::: Object.finalize()-->调用这个方法来释放资源: 多态(执行期间(执行期间-->你在控制台上写 java 类名 运行某个文件的时候叫执行期间)的动态绑定, 池绑定): 重载

关情纸尾-----面向对象的三大特性

面向对象的三大特性 .封装 .继承 .多态 一.封装 1.set方法 (1)作用:提供一个方法给外界设置成员变量,可以在方法里面对参数进行过滤 (2)命名规范: 方法都是以set开头,而且后面要跟上成员变量名,成员变量名的首字母必须是大写 (3)形参名称不要和成员变量同名 (4)返回值一定是void (5)一定要接收一个参数,而且参数类型和成员变量类型一致 2.get方法 (1)作用:返回内部的成员变量 (2)命名规范:方法的名称一般就跟成员变量同名 (3)一定有返回值,并且返回值类型和成员变量

java面向对象的三大特性

1.面向对象的三大特性 继承.封装.多态 什么是继承? ①继承是面向对象程序设计能够提高软件开发效率的重要原因之一. ②继承是具有传递性的,就像现实中孙子不仅长得像爸爸而且还像他爷爷. ③继承来的属性和方法是隐式的,也就是在本类里面是看不见的. ④一个类只能有一个父类,也就是类只能是单继承. ⑤一个接口可以有多个父类,也就是接口可以是多继承. 实际项目开发中,一个类继承于另一个类,那么前者就是后者的子类,反则反之. 什么是封装? 对象数据和操作该对象的指令都是对象自身的一部分,能够实现尽可能对外

面向对象基础和面向对象的三大特性之一:封装(20161024)

面向对象 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Con

黑马程序员——面向对象编程三大特性

黑马程序员——面向对象编程三大特性 ------- android培训.IOS培训.期待与您交流! ---------- 面向对象编程三大特性:封装,继承,多态,(抽象) ***封装的概念与原理*** 封装是面向对象的特性之一 封装的好处:降低数据被无用的可能性,保证数据安全性 不封装的缺点:会把自己的属性暴露给外部,失去对该属性的管理权 封装原理:实例变量默认只能被当前类的对象方法访问 **封装实现** 定义设置实例变量(setter)方法和访问实例变量(getter)方法 1)setter(

java学习中,面向对象的三大特性:封装、继承、多态 以及 super关键字和方法的重写(java 学习中的小记录)

java学习中,面向对象的三大特性:封装.继承.多态 以及 super关键字和方法的重写(java 学习中的小记录) 作者:王可利(Star·星星) 封装     权限修饰符:public 公共的,private 私有的     封装的步骤:          1.使用private 修饰需要封装的成员变量.          2.提供一个公开的方法设置或者访问私有的属性              设置 通过set方法,命名格式:     set属性名();  属性的首字母要大写 访问 通过ge

java基础篇(二) ----- java面向对象的三大特性之继承

java面向对象的三大特性之继承: 复用代码是java众多引人注目的功能之一,但是想要成为极具革命性的语言,仅仅是复制代码并对其加以改变是不够的.它必须能够做更多的事.引自<Think in java>    而代码复用也是程序员一直不断追求的.由此来说下代码复用的一种方式 java面向对象的三大特性--继承!! 在面向对象程序设计中,继承机制可以有效地组织类的结构.确定类之间的关系,在已有类的基础上开发新的类.继承机制在程序代码复用.提高软件开发效率.降低软件系统维护成本等方面具有重要作用.