Python 多态 对象常用内置函数 运算符重载 对象迭代器 上下文管理

一 多态

1.什么是多态:多态不是一个具体的技术或代码。指的时候多个不同类型对象可以响应同一个方法,产生不同的结果。

2.使用多多态的好处:提高了程序的灵活性,拓展性

3.如何实现:鸭子类型 就是典型的多态 多种不同类型 使用方法一样

4.案例

class Cat():
    def bark(self):
        print("喵喵喵")
    def run(self):
        print("四条腿跑!")
    def sleep(self):
        print("趴着睡!")

class Pig():
    def bark(self):
        print("哼哼哼!")
    def run(self):
        print("四条腿跑!")
    def sleep(self):
        print("侧躺着睡!")

# 一个用来管理动物的方法   只要你传入是一个动物 我就按照动物的标准来使用 完全不用考虑你具体是什么类型
def management_animal(animal):
    print("==================正在溜%s=============" % animal.__class__.__name__)
    animal.bark()
    animal.run()
    animal.sleep()

二 isinstance(参数1,参数2)内置函数

1.判断一个对象是否是某个类的实例,结果为布尔类型

参数1 要判断的对象

参数2 要判断的类型

2.案例:

a = isinstance(‘own‘,str) # 判断对象是否字符串类型
print(a) # True 

def add_num(a,b):
    if isinstance(a,int) and isinstance(b,int): # 判断是否是整型
        return a+b
    return None
print(add_num(20,10)) # 30

三  issubclass(参数1,参数2)内置函数

1.判断一个类是否是另一个类的子类。

参数一是子类

参数二是父类

2.案例:

class Animal:
    def eat(self):
        print("动物得吃东西...")

class Pig(Animal):
    def  eat(self):
        print("猪得吃 猪食....")

a = issubclass(Pig,Animal)
print(a) # True

p = Pig()
b = issubclass(type(p),Animal)
print(b) # True

# 拓展
print(type(p),p.__class__) # <class ‘__main__.Pig‘> <class ‘__main__.Pig‘>

四 对象常用内置函数

__str__()

1.触发时机:在将对象转为字符串时执行 。注意:返回值必须为字符串类型。

2.使用场景:子类可以覆盖该方法来完成 对打印内容的自定义

3.该方法在object中有定义 默认行为 返回对象类型以及地址 <__main__.Person object at 0x0000016F450C7390>

class Person:
    def __init__(self,name,age):
        self.name = name
        self.age = age
    # 将对象转换为字符串时执行r
    def __str__(self):
        print("str run")
        return "my name is %s , age is %s" % (self.name,self.age)
p = Person("rose",20)

print(p) #在打印前都会现将要打印的内容转为字符串  通过调用__str__函数

q = str(p)
print(q)

__del__()

1.触发时机:手动删除对象时立马执行,或是程序运行结束时也会自动执行

2.使用场景:当你的对象在使用过程中,打开了不属于解释器的资源:例如文件,网络端口

3.注意:该函数不是用来删除对象的

# del使用案例

class FileTool:
    """该类用于简化文件的读写操作 """

    def __init__(self,path):
        self.file = open(path,"rt",encoding="utf-8")
        self.a = 100

    def read(self):
        return self.file.read()

    # 在这里可以确定一个事,这个对象肯定不使用了 所以可以放心的关闭问文件了
    def __del__(self):
        self.file.close()

tool = FileTool("a.txt")
print(tool.read())

__call__()

1.触发时机:在调用对象时自动执行,(既对象加括号)

#call 的执行时机
class A:
    def __call__(self, *args, **kwargs):
        print("call run")
        print(args)
        print(kwargs)

a = A()
a(1,a=100) # call run (1,) {‘a‘: 100}

__slots__

该属性是一个类属性,用于优化对象内存占用
优化的原理,将原本不固定的属性数量,变得固定了
这样的解释器就不会为这个对象创建名称空间,所以__dict__也没了  
从而达到减少内存开销的效果

另外当类中出现了slots时将导致这个类的对象无法在添加新的属性

# slots的使用
import sys
class Person:

    __slots__ = ["name"] # 对象中只能添加‘name‘的属性,添加其他报错
    def __init__(self,name):
        self.name = name

p =  Person("jck")

# 查看内存占用
print(sys.getsizeof(p)) # 48
# p.age = 20 # 无法添加

# dict 没有了
print(p.__dict__)  # 报错 因为类中有__slots__ 所以__dict__不存在了

__getattr__()   __setattr__()   __delattr__()

__getattr__()

1.执行时机:对象用点访问属性的时候,如果属性不存在时执行(无论是类中的属性还是对象中属性)

class A:
    def __getattr__(self, item):
        print("__getattr__")
        return 1
a = A()
print(a.name) # __getattr__ 1

__getattribute__()

1.getattribute 该函数也是用来获取属性
在获取属性时先执行__getattribute__()。如果属性存在执行完__getattribute__()则不再执行__getattr__(),如果属性不存在执行完__getattribute__()则再执行__getattr__()。

class A:

     def __getattr__(self, item):
        print("__getattr__")
        return 1
     def __getattribute__(self, item):
        print("__getattribute__")
        # return self.__dict__[item]
        return super().__getattribute__(item)
a = A()
print(a.name) # __getattribute__ __getattr__ 1

a.name = ‘jack‘
print(a.name) # __getattribute__ jack

__setattr__()

1.执行时机:对象用点设置属性时(无论是添加还是修改)

class A:
    def __setattr__(self, key, value):
        print(key) # name
        print(value) # jack
        print("__setattr__")
        self.__dict__[key] = value

a = A()
a.name = "jack" # name jack __setattr__

__delattr__()

1.执行时机:用del 对象.属性  删除属性时 执行(属性要先存在)

class A:
     def __delattr__(self, item):
        print("__delattr__")
        print(item)
        self.__dict__.pop(item)
        pass
a = A()
a.name = "jack"
del a.name # __delattr__  name

[] 的实原理

getitem setitem delitem

__geitem__()

1.执行时机:当对象用中括号去获取属性时 执行

class A:
    def __getitem__(self, item):
        print("__getitem__")
        return self.__dict__[item]
a = A()
a.name = "jack"
print(a["name"]) #  "jack"

__setitem__()

1.执行时机:当对象用括号去设置属性时 执行

class A:
        def __setitem__(self, key, value):
        print("__setitem__")
        self.__dict__[key] = value
a = A()
a["name"] = "jack" # __setitem__

__delitem__()

1.执行时机:当对象用中括号去删除属性时 执行

class A:
        def __delitem__(self, key):
        del self.__dict__[key]
        print("__delitem__")
a = A()
a.name = "jack"
del a["name"] # __delitem__

五 运算符重载(对象大小比较)与迭代器

class Student(object):
    def __init__(self,name,height,age):
        self.name = name
        self.height = height
        self.age = age

    def __gt__(self, other):
        # print(self)
        # print(other)
        # print("__gt__")
        return self.height > other.height

    def __lt__(self, other):
        return self.height < other.height

    def __eq__(self, other):
        if self.name == other.name and  self.age == other.age and self.height == other.height:
            return True
        return False

stu1 = Student("jack",180,28)
stu2 = Student("jack",180,28)
# print(stu1 > stu2) # 触发 __gt__(self, other)
# print(stu1 < stu2) # 触发 __lt__(self, other)
print(stu1 == stu2) #  # 触发 __eq__(self, other)
上述代码中,other指的是另一个参与比较的对象,

大于和小于只要实现一个即可,符号如果不同  解释器会自动交换两个对象的位置 ,只能在同一个类中比较

# 实现一个自定义的range

class MyRange:

    def __init__(self,start,end,step):
        self.start = start
        self.end = end
        self.step = step

    def __iter__(self):
        return self

    def __next__(self):
        a = self.start
        self.start += self.step
        if a < self.end:
            return a
        else:
            raise StopIteration

for i in MyRange(1,10,2):
    print(i) # 1 3 5 7 9

六 上下文管理

当执行with 语句时,会先执行enter ,

当代码执行完毕后执行exit,或者代码遇到了异常会立即执行exit,并传入错误信息

包含错误的类型.错误的信息.错误的追踪信息
注意:
    enter 函数应该返回对象自己
    exit函数 可以有返回值,是一个bool类型,用于表示异常是否被处理,仅在上下文中出现异常有用
    如果为True 则意味着,异常以及被处理了
    False,异常未被处理,程序将中断报错

class MyOpen(object):

    def __init__(self,path):
        self.path = path

    def __enter__(self):
        self.file = open(self.path)
        print("enter.....")
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        print("exit...")
        # print(exc_type,exc_val,exc_tb)
        self.file.close()
        return True

with MyOpen("a.txt") as m:
    print(m) # enter.....  <__main__.MyOpen object at 0x0000015CD88B84E0> exit...

原文地址:https://www.cnblogs.com/tfzz/p/11266478.html

时间: 2024-08-05 06:18:15

Python 多态 对象常用内置函数 运算符重载 对象迭代器 上下文管理的相关文章

python day4笔记 常用内置函数与装饰器

1.常用的python函数 abs             求绝对值 all               判断迭代器中所有的数据是否为真或者可迭代数据为空,返回真,否则返回假 any             判断迭代器中的数据是否有一个为真,有返回真,可迭代数据为空或者没有真,返回假 bin             转换整数为二进制字符串 hex            转换整数为十六进制字符串 oct             转换整数为八进制字符串 bool           转换数据为布尔值

python自定义函数、常用内置函数

1.python自定义函数 Python中用户自己编写的用于实现特定功能的函数代码块,就是自定义函数. 如: def是关键字,saa是自定义函数名,括号用于传参,可以不写参数,冒号后面是函数代码块,这里只写了一条print语句 注意:函数不调用不执行,只有调用函数才会执行 小练习1: 执行结果是: : 再来看一个小练2: 这是一个用来生成双色球的小程序,如蓝色球号码 01 红色球 22 12 23 14 05 26,蓝色球数字范围1-16,红色球数字范围1-33,最后一行调用produce()自

python常用内置函数学习(持续更新...)

python常用内置函数学习 一.python常用内置函数有哪些 dir() 二.每个内置函数的作用及具体使用 1.dir()不带参数时返回当前范围内(全局.局部)的变量.方法和定义的类型列表:   带参数A时返回参数的属性.方法的列表,如何该参数A对象有__dir__(),该方法被调用,如果不含有该方法,该方法不会报错,而是尽可能多的收集参数对象A的信息   实例: 不带参数,在分别在文件全局调用和在函数中局部调用dir()   带参数   原文地址:https://www.cnblogs.c

python第十八课——常用内置函数

常用内置函数:round(): print(round(3.14),round(3.99)) print(round(3145.926,-2),round(413.575,2)) abs(): print(abs(-2),abs(-1),abs(0),abs(1),abs(2)) max().min().sum() print(max([1,2,3,4,5])) print(min([1,2,3,4,5])) print(sum([1,2,3,4,5])) 以下比较的是字符串中每个字符的asci

python序列(七)序列操作的常用内置函数

1.len(列表):返回:列表中的元素个数,同样适用于元组.字典.集合.字符串等. max(列表).min(列表):返回列表中的最大或最小元素同样适用于元组.字典.集合.range对象等. sum(列表):对列表的元素进行求和运算,对非数值型列表运算需要指定start参数,同样适用于元组.range. >>> sum(range(1,11)) #sum()函数的start参数默认为0 55 >>> sum(range(1,11),5) #指定start参数为5 60&g

常用内置函数补充

常用内置函数: 1.calladle()是验证一个对象可不可以被调用. 2.chr() 是通过数字在ask码里找到指定字符. 3.ord()通过字符找到它在ask码里对应的数字 4.import random 随机生成数字的模块,想要随机生成数字时调用(应用场景随机验证码) 5.random.randrange(65,91)也就是我们生成的数字大于65小于91. 6.compile()将字符串编译成python代码 k=compile(i,"<string>","

1.3.2 常用内置函数

常用内置函数(Built-In Functions,BIF)不需要导入任何模块即可直接使用,在IDLE中执行如下命令可以列出所有内置函数和内置对象,如代码块1.3.2.1所示: 1 >>> dir(__builtins__) 2 ['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException', 'BlockingIOError', 'BrokenPipeError', 'BufferError', 'Byte

python学习笔记11-python内置函数

python学习笔记11-python内置函数 一.查看python的函数介绍: https://docs.python.org/2/library/ 二.python内置函数 1.abs获取绝对值: 通过python官网查看abs abs(x) Return the absolute value of a number. The argument may be a plain or long integer or a floating point number. If the argument

Python标准库:内置函数open(file, mode=&#39;r&#39;, buffering=-1, encoding=None, errors=None, newline=None, closefd=T

本函数是打开一个文件并返回文件对象.如果文件不能打开,抛出异常OSError. 参数file是一个字符串表示的文件名称,或者一个数组表示的文件名称.文件名称可以是相对当前目录的路径,也可以是绝对路径表示. 参数mode是指明打开文件的模式.默认值是'r',表示使用文本的方式打开文件来读取. 'r'表示打开文件只读,不能写. 'w'表示打开文件只写,并且清空文件. 'x'表示独占打开文件,如果文件已经存打开就会失败. 'a'表示打开文件写,不清空文件,在文件后尾追加的方式写入. 'b'表示二进制的