zoukankan      html  css  js  c++  java
  • 1.多态 2.ininstance,issubclass3.str,del,call,slots 4. .取值 5.[]取值 6.运算符重载 7.迭代器类 8.上下文 # 23

    面向对象知识点
     1 """"""
     2 """
     3 多态
     4     一种事物具备多种不同的形态
     5     例:水:固态 气态 液态
     6     大黄蜂:汽车人,汽车,飞机
     7 
     8 官方解释:
     9     多个不同对象可以响应同一个方法,产生不同的结果
    10 首先强调
    11     多态不是一种特殊的语法,
    12     而是一种状态,特性
    13     (即:多个不同对象可以响应同一个方法,产生不同的结果)
    14     即:多个对象有相同的使用方法
    15     
    16     好处:对于使用者而言,大大降低了使用难度
    17     
    18     例如 :之前写的USB接口,鼠标,键盘都属于多态
    19     
    20 实现多态:
    21     接口 抽象 鸭子类型
    22     都可以写出具备多态的代码,最简单的就是鸭子类型
    23     
    24 """
    25 #"""案例"""
    26 """
    27 要管理鸡,鸭,鹅
    28 如何能够最方便的管理,即我说同一句话,他们都能理解,即他们拥有同一种方法
    29 """
    30 class Ji:
    31     def bart(self):
    32         print('咯咯咯...')
    33     def spawn(self):
    34         print('下蛋了...')
    35 class Duck:
    36     def bart(self):
    37         print('嘎嘎嘎...')
    38     def spawn(self):
    39         print('下蛋了...')
    40 class E:
    41     def bart(self):
    42         print('鹅鹅鹅...')
    43     def spawn(self):
    44         print('下蛋了...')
    45 # 规范
    46 def mange(obj):
    47     obj.bart()
    48     obj.spawn()
    49 
    50 j = Ji()
    51 mange(j)
    52 d= Duck()
    53 mange(d)
    54 e = E()
    55 mange(e)
    56 """
    57 咯咯咯...
    58 下蛋了...
    59 嘎嘎嘎...
    60 下蛋了...
    61 鹅鹅鹅...
    62 下蛋了...
    63 """
    64 # """案例2"""
    65 # python中到处都有多态
    66 a = 10
    67 b = "10"
    68 c = [10]
    69 
    70 print(type(a))
    71 print(type(b))
    72 print(type(c))
    73 """
    74 <class 'int'>
    75 <class 'str'>
    76 <class 'list'>
    77 """
    1.多态和多态性的实现.py
     1 """"""
     2 """
     3 1.isinstance  
     4     判断一个对象是否是某个类的实例
     5     参数1:要判断的对象
     6     参数2:要判断的类型
     7     语法:
     8     isinstance(实例化对象,数据类型)
     9 """
    10 # 案例
    11 def add_cost(x,y):
    12     if isinstance(x,str) and isinstance(y,str):
    13         return x+y
    14     return None
    15 a = add_cost('12','45')
    16 print(a)  # 1245
    17 b = add_cost('1',2)
    18 print(b)  # None
    19 """
    20 2.issubclass
    21     判断一个类是否是另一个类的子类
    22     参数1:子类
    23     参数2 :父类
    24     语法:
    25     issubclass(子类,父类)
    26 """
    27 # 案例:
    28 class Animal:
    29 
    30     def eat(self):
    31         print("动物得吃东西...")
    32 class Pig(Animal):
    33     def eat(self):
    34         print('猪吃猪食...')
    35 
    36 class Dog(Animal):
    37     def eat(self):
    38         print('狗吃狗粮...')
    39 
    40 class Tree:
    41     def lifht(self):
    42         print('植物光合作用')
    43 
    44 # 协议
    45 def sucess(obj):
    46     # obj 的类是否继承自obj
    47     if issubclass(type(obj),Animal):
    48         obj.eat()
    49     else:
    50         print('123')
    51 
    52 p = Pig()
    53 sucess(p)  # 猪吃猪食...
    54 d = Dog()
    55 sucess(d)  # 狗吃狗粮...
    56 t = Tree()
    57 sucess(t)  # 123
    58 print(issubclass(Tree,object))  # True
    2.OOP相关内置函数.py
     1 ''''''
     2 """
     3 1.str
     4     __str__会在对象被转换为字符串时,转换的结果就是这个函数的返回值
     5     
     6     作用:自定义打印结果
     7     
     8     使用场景:我们可以利用该函数来自定义,对象的打印格式
     9 """
    10 # 案例:
    11 class Person:
    12     def __init__(self,name,age):
    13         self.name = name
    14         self.age = age
    15     def __str__(self):
    16         return 'name:%s age:%s'%(self.name,self.age)  # name:llx age:123
    17 p = Person('llx','123')
    18 print(p)  # name:llx age:123
    19 '''
    20 2.del
    21     执行时机:手动删除对象时立马执行,或是程序运行结束时,也会自动执行
    22     
    23     使用场景:
    24     当你的对象在使用过程中,打开了不属于解释器的资源:例如文件,网络端口
    25 
    26 '''
    27 # 案例
    28 class FileTool:
    29     """该类用于简化文件的读写操作"""
    30     def __init__(self,path):
    31         self.file = open(path,"rt",encoding="utf-8")
    32         self.a = 100
    33     def read(self):
    34         return self.file.read()
    35     # 在这里可以确定一个事,这个对象肯定不使用了 所以可以放心的关闭问文件了
    36     def __del__(self):
    37         self.file.close()
    38 f = FileTool('a.txt')
    39 # print(f.read())
    40 print(f.__del__())  # 已关闭
    41 """
    42 3.call
    43 执行时机:在调用自身时执行(即,对象+())
    44 """
    45 # 案例:
    46 # call的执行时机
    47 class A:
    48     def __call__(self,*args,**kwargs):
    49         print("call run")
    50         print(args)
    51         print(kwargs)
    52 a = A()
    53 a(1,2,3,4,5)  # (1, 2, 3, 4, 5)
    54 print(a)
    55 """
    56 4.__slots__
    57     该属性是一个类属性.
    58     作用:用于优化对象内存占用,
    59     
    60     优化的原理:将原本不固定的属性数量变得固定了
    61     
    62     这样解释器也就不会为这个对象创建名称空间,所以__dict__也没了
    63     
    64     从而达到减少内存开销的结果
    65     
    66     另外当类中出现slots时将导致这个类的对象将无法再添加新的属性
    67 """
    68 # 案例
    69 class Person:
    70     __slots__ = ["name","age","money"]
    71     def __init__(self,name,age,money):
    72         self.name = name
    73         self.age = age
    74         self.money =money
    75         # 当类中出现slots时将导致这个类的对象将无法再添加新的属性,只能添加他所在类的属性
    76         # print(self.__dict__)  # dict 没有了
    77         # AttributeError: 'Person' object has no attribute '__dict__'
    78 p = Person('jck','20',10000)
    79 import sys
    80 # sys.getsizeof 方法可以查看 python 对象的内存占用,单位:字节 (byte)
    81 print(sys.getsizeof(p))   # 64
    82 # print(p)
    3.类中的魔法函数.py
     1 """"""
     2 """
     3 getattr 用点访问属性时,如果属性不存在时执行
     4 setattr 用点设置属性时
     5 delattr 用del 对象.属性 删除属性时执行
     6 
     7 ps:
     8     getattribute 该函数也是用来获取属性的,
     9     在获取属性时,如果存在getattribute则先执行该函数,
    10     如果没有拿到属性则继续调用getattr函数,
    11     如果拿到则直接返回
    12 """
    13 # 案例:
    14 class A:
    15     def __setattr__(self,key,value):
    16         print(key)
    17         print(value)
    18         print("__setattr__")
    19         self.__dict__[key] = value
    20 
    21     def __delattr__(self, item):
    22         print("__delattr__")
    23         print(item)
    24         self.__dict__.pop(item)
    25     def __getattr__(self,item):
    26         print("__getattr__")
    27         return 1
    28     def __getattribute__(self, item):
    29         print("__getattribute__")
    30         # return self.__dict__[item]
    31         return super().__getattribute__(item)
    32 
    33 a = A()
    34 # setattr 用点设置属性时
    35 a.name = 'llx'
    36 print(a.name)
    37 """
    38 name
    39 llx
    40 __setattr__
    41 __getattribute__
    42 __getattribute__
    43 llx
    44 """
    45 # delattr 用del 对象.属性 删除属性时执行
    46 del a.name
    47 print(a.name)
    48 """
    49 __delattr__
    50 name
    51 __getattribute__
    52 __getattribute__
    53 __getattr__
    54 1
    55 """
    56 # getattr 用点访问属性时,如果属性不存在时执行
    57 print(a.xxx)
    58 """
    59 __getattribute__
    60 __getattr__
    61 1
    62 """
    63 """
    64 ps:
    65     getattribute 该函数也是用来获取属性的,
    66     在获取属性时,如果存在getattribute则先执行该函数,
    67     如果没有拿到属性则继续调用getattr函数,
    68     如果拿到则直接返回
    69 """
    70 a.name = 'xxx'
    71 print(a.name)
    72 """
    73 name
    74 xxx
    75 __setattr__
    76 __getattribute__
    77 __getattribute__
    78 xxx
    79 """
    80 b = A()
    81 b.__dict__["name"] = "wyf"
    82 print(b.name)
    83 """
    84 __getattribute__
    85 __getattribute__
    86 wyf
    87 """
    4.(.取值)属性的get set 和del.py
     1 """"""
     2 """[]的实原理"""
     3 """getitem,setitem,delitem"""
     4 """
     5 任何符号,都会被解释器解释成特殊含义,例如 . [] ()
     6 """
     7 """
     8 getitem 当你用中括号去获取属性时 执行
     9 setitem 当你用中括号去设置属性时 执行
    10 delitem 当你用中括号去删除属性时 执行 
    11 """
    12 # 案例1:
    13 # class A:
    14 #     def __getitem__(self, item):
    15 #         print("__getitem__")
    16 #         return self.__dict__[item]
    17 #     def __setitem__(self, key, value):
    18 #         print("__setitem__")
    19 #         self.__dict__[key] = value
    20 #     def __delitem__(self, key):
    21 #         del self.__dict__[key]
    22 #         print("__delitem__")
    23 # a = A()
    24 # # getitem 当你用中括号去获取属性时 执行
    25 # a.name = 'llx'
    26 # # setitem 当你用中括号去设置属性时 执行 覆盖
    27 # # a['name'] = 'llw'
    28 # print(a['name'])
    29 # delitem 当你用中括号去删除属性时 执行 删掉
    30 # del a['name']
    31 # print(a['name'])
    32 
    33 """案例2"""
    34 """
    35 需求让一个对象支持 点语法来取值 也支持括号取值
    36 """
    37 class MyDict(dict):
    38 
    39     def __getattr__(self, key):
    40         return self.get(key)
    41     def __setattr__(self, key, value):
    42         self[key] = value
    43     def __delattr__(self, item):
    44         del self[item]
    45 
    46 b = MyDict()
    47 b["name"] = "jack"
    48 print(b["name"])
    49 print(b.name)
    50 """
    51 jack
    52 jack
    53 """
    54 b.age = 20
    55 print(b["age"])  # 20
    5.([]取值)getitem,setitem,delitem.py
     1 """"""
     2 """
     3 运算符重载
     4     当我们在使用某个符号时,
     5     Python解释器都会为这个符号定义一个含义,
     6     同时调用对应的处理函数,
     7     
     8     当我们需要自定义对象比较规则时,
     9     就可在子类中覆盖 大于 等于 等一系列方法...
    10 """
    11 """
    12 案例:
    13 
    14     原本自定义对象无法直接使用大于小于来进行比较 ,
    15     我们可自定义运算符来实现,
    16     让自定义对象也支持比较运算符  
    17 """
    18 class Student:
    19     def __init__(self,name,height,age):
    20         self.name = name
    21         self.height = height
    22         self.age = age
    23     def __gt__(self, other):
    24         print(self)
    25         print(other)
    26         print("__gt__")
    27         return self.height>other.height
    28     def __lt__(self, other):
    29         return self.height<other.height
    30     def __eq__(self, other):
    31         if self.name == other.name and self.age == other.age and self.height == other.height:
    32             return True
    33         return False
    34 s1 = Student('llw','174','18')
    35 s2 = Student('llx','180','24')
    36 
    37 print(s1 == s2)  # False
    38 print(s1>s2)
    39 """
    40 <__main__.Student object at 0x0000024008F821D0>
    41 <__main__.Student object at 0x0000024008F82208>
    42 __gt__
    43 False
    44 """
    45 print(s1<s2)  # True
    46 """
    47 上述代码中,other指的是另一个参与比较的对象,
    48 
    49 大于和小于只要实现一个即可,符号如果不同  解释器会自动交换两个对象的位置 
    50 """
    6.(运算符重载)对象比较大小.py
     1 """"""
     2 """
     3 迭代器协议
     4 
     5     迭代器是指具有__iter__和__next__的对象
     6     
     7     我们可以为对象增加两个方法来让对象变成一个迭代器
     8 """
     9 # 语法
    10 # 案例:自定义一个range
    11 class MyRange:
    12     def __init__(self,start,end,step=1):
    13         self.start = start
    14         self.end = end
    15         self.step = step
    16     def __iter__(self):
    17         return self
    18     def __next__(self):
    19         a = self.start
    20         self.start += self.step
    21         if self.end > a:
    22             return a
    23         else:
    24             # 报错停止
    25             raise StopIteration
    26 m = MyRange(1,10,3)
    27 m.__iter__()
    28 print(m.__next__())
    29 print(m.__next__())
    30 print(m.__next__())
    31 # print(m.__next__())
    32 """
    33 1
    34 4
    35 7
    36 raise StopIteration
    37 StopIteration
    38 """
    39 for i in MyRange(1,100,10):
    40     print(i)
    7.迭代器类 __iter__,__next__.py
     1 """"""
     2 """
     3 1.上下文管理
     4 
     5     上下文 context
     6     
     7     这个概念属于语言学科,指的是一段话的意义,要参考当前场景,即:上下文
     8     
     9     在Python中,上下文可以理解为是一个代码区间,一个范围,
    10     例如with open打开的文件,仅在这个上下文中有效
    11 """
    12 """
    13 2.涉及到两个方法
    14     1.enter:表示进入上下文,(进入某个场景了)
    15     2.exit:表示退出上下文,(退出某个场景了)
    16     
    17     当执行with 语句时,会先执行enter,
    18     当代码执行完毕后执行exit,
    19     或者代码遇到异常会立刻执行exit,并传入错误信息
    20     
    21     错误信息类型:错误的信息,错误的追踪信息
    22     
    23 ps:
    24     enter 函数应该返回对象自己
    25     
    26     exit函数 可以有返回值,是一个bool类型,用于表示一场是否被处理,仅在上下文中出现异常有用
    27     
    28     如果为 True 意味着异常已经被处理
    29     False,异常未被处理,程序中断出错 
    30 """
    31 class MyOpen:
    32     def __init__(self,path):
    33         self.path = path
    34     def __enter__(self):
    35         self.file = open(self.path)
    36         print("enter....")
    37         return self
    38     def __exit__(self, exc_type, exc_val, exc_tb):
    39         print('exit...')
    40         print(exc_type, exc_val, exc_tb)
    41         self.file.close()
    42         return True
    43 with MyOpen('a.txt')as f:
    44     print(f)
    45     # print(f.file.read())
    46     # 中途不能插入其他无关数据,否则就不是的上下文了
    47     "123"+1
    48     f.file.read()
    49     print(f.file.read())
    50 """
    51 enter....
    52 <__main__.MyOpen object at 0x000001F503CF8518>
    53 asasasa
    54 exit...
    55 <class 'TypeError'> must be str, not int <traceback object at 0x000001F503D01F08>
    56 """
    8.上下文管理.enter,exit.py
    总结
     1 1.多态
     2 
     3     是一种状态,如果程序具备这种状态,对象的使用者,可以很方便忽略对象之间的差异
     4 
     5     我们可以通过鸭子类型来让程序具备多态性
     6 
     7 2.一对函数
     8 
     9  isinstance(对象实例化,数据类型)   判断类型 优先
    10 
    11 issubclass(子类,父类) 判断两者是否是父子关系   优先
    12 
    13 3.类中的魔法函数
    14 
    15 str  优先
    16     __str__  会在对象被转换为字符串时,转换的结果就是这个函数的返回值
    17     使用场景:我们可以利用该函数来自定义,对象的是打印格式
    18 
    19 del  优先
    20     执行时机: 手动删除对象时立马执行,或是程序运行结束时也会自动执行
    21     使用场景:当你的对象在使用过程中,打开了不属于解释器的资源:例如文件,网络端口
    22 
    23 call
    24     执行时机:在调用对象时自动执行,(既对象加括号)
    25 
    26 slots   __slots__ = ["name"] 限制作用
    27     该属性是一个类属性,用于优化对象内存占用
    28     优化的原理,将原本不固定的属性数量,变得固定了
    29     这样的解释器就不会为这个对象创建名称空间,所以__dict__也没了
    30     从而达到减少内存开销的效果
    31 
    32 4.点语法的 实现   getattr setattr delattr
    33 print(a.name)
    34 
    35 5.[]取值的实现  getitem setitem delitem
    36 print(a["name"])
    37 
    38 6.运算符重载,可以让对象具备相互间比较的能力
    39 # 传进类中两个对象,在方法中进行比较,返回符合的结果
    40 7.迭代器的两个函数   iter next
    41 
    42 8.上下文管理    优先   可以实现自动清理     与del的区别 del管理的是对象的生命周期  会在对象销毁时执行清理
    43 
    44 上下文管理,管理的是一个代码范围 ,出了范围自动清理
    总结
  • 相关阅读:
    git——学习笔记(一)
    技术大牛的博客//文档
    python——周边
    数据挖掘算法:关联分析二(Apriori)
    数据挖掘算法:关联分析一(基本概念)
    Python入门5(pandas中merge中的参数how)
    Spark入门3(累加器和广播变量)
    Spark入门2(Spark简析)
    Spark入门1(以WordCount为例讲解flatmap和map之间的区别)
    算法入门1(决策树)
  • 原文地址:https://www.cnblogs.com/llx--20190411/p/11266630.html
Copyright © 2011-2022 走看看