python多态代码_python源码与多态

'''

1.多态

一种事物具备不同的形态

ps:水 固态 液态 气态

官方:多个不同类对象可以响应同一个方法,产生不同的结果

多个对象有相同的使用方法,

# 对于使用者会大大降低其是用难度 如之前写的usb接口

'''

class JI:

def bark(self):

print("哥哥哥")

def spawn(self):

print("下鸡蛋..")

class Duck:

def bark(self):

print("嘎嘎嘎")

def spawn(self):

print("下鸭蛋")

class E:

def bark(self):

print("饿饿饿....")

def spawn(self):

print("下鹅蛋..")

j = JI()

y = Duck()

e = E()

def mange(obj):

obj.spawn()

mange(j)

mange(y)

mange(e)

# python中到处都有多态

a = 10

b = "10"

c = [10]

print(type(a))

print(type(b))

print(type(c))

# 2.oop中的interface与issubclass

'''

interface

判断一个对象是否是某个类的实例

参1 要判断的对象

参2 要判断的类型

issubclass

判断一个类是否是另一个类的字类

参1 字类

参2 父类

'''

# def add_num(a,b):

#

# if isinstance(a,int) and isinstance(b,int):

# return a+b

# return None

#

# print(add_num(20,10))

class Animal:

def eat(self):

print("动物得吃东西...")

class Pig(Animal):

def eat(self):

print("猪得吃 猪食....")

class Tree:

def light(self):

print("植物光合作用....")

pig = Pig()

t = Tree()

#

# def manage(obj):

# if issubclass(type(obj),obj):

# obj.eat()

# else:

# print("不是一头动物!")

#

# # manage(pig)

#

# manage(t)

# print(issubclass(Tree,object))

# 3.双下划线系列的magic函数,即源代码

'''

__str__

会在对象被转为字符串时,转换的结果就是这个函数的返回值

使用场景:我们可以利用该函数来自定义,对象的打印格式

del

执行时机:手动删除对象立马执行,或程序结束时也会运行

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

# 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

执行时机:在调用对象时自动执行,(即对象加括号)

class A:

def __call__(self, *args, **kwargs):

print("call run")

print(args)

print(kwargs)

a = A()

a(1,a=100)

slots

该属性是一个类属形,用于优化内存占用,这个时候无法使用__dict__

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

class Person:

__slots__ = ["name"]

def __init__(self,name):

self.name = name

p = Person("jck")

# 查看内存占用

# print(sys.getsizeof(p))

# p.age = 20 # 无法添加

# dict 没有了

print(p.__dict__)

'''

# 4.

'''

getarttr 用点访问属性时如果属性不存在则执行

setattr 用点设置属性时

delatter 用del 对象.属性 删除属性时 执行

这几个函数反映了python解释器是如何实现 用点来访问属性的

在获取属性时如果存在gertattribute则先执行该函数,

如果没有拿到属性则继续调用getattr函数,如果拿到了则直接返回

# getitem setitem delitem

任何的符号 都会被解释器解释成特殊含义 ,例如 . [] ()

```python

getitem 当你用中括号去获取属性时 执行

setitem 当你用中括号去设置属性时 执行

delitem 当你用中括号去删除属性时 执行

```

'''

5.运算符重载

'''

gt 大于

lt 小于

eq 等于

'''

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)

print(stu1 == stu2)

6.迭代器协议

# 迭代器是指有__inter__和__next__的对象

# 我们可以为对象增加这两个方法来让对象变成一个迭代器

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)

# 7.上下文管理

# 涉及到的两个方法:

#

# ## enter

#

# ​ 表示进入上下文,(进入某个场景 了)

#

# ## exit

#

# 表示退出上下文,(退出某个场景 了)

#

#

#

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

#

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

#

# 包含错误的类型.错误的信息.错误的追踪信息

#

# 表示退出上下文,(退出某个场景 了)

#

#

#

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

#

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

#

# 包含错误的类型.错误的信息.错误的追踪信息

# 注意

# enter 函数应该返回对象自己

# exit函数 可以有返回值,是一个bool类型,用于表示异常是否被处理,仅在上下文中出现异常有用

# 如果为True 则意味着,异常以及被处理了

# False,异常未被处理,程序将中断报错

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值