目录
一、自定义比较对象__gt__大于,__lt__小于,__eq__等于
可以利用这三个自定义比较对象:
gt:greater than 大于缩写
lt:less than 小于缩写
eq:equal 等于缩写
class Student(object):
def __init__(self, name, height, age):
self.name = name
self.height = height
self.age = age
# 比较大于时触发
def __gt__(self, other):
return self.height > other.height
# 比较小于时触发
def __lt__(self, other):
return self.age < other.age
# 比较等于时触发
def __eq__(self, other):
# if self.age == other.age: # 比较两个对象的年龄
if self.age == other.age and self.height == other.height: # 比较年龄和身高
return '年龄身高一样'
return '年龄身高不一样'
stu1 = Student("jeff", 170, 25)
stu2 = Student("make", 170, 25)
print(stu1 > stu2)
print(stu1 < stu2)
print(stu1 == stu2)
二、上下文管理__enter__进入文件时,__exit__离开
enter:1.进入文件,开打文件时执行
2.函数应该返回自己self
exit:1.退出文件、报错中断、或者代码执行完时执行
2.可以有返回值,是bool类型
class MyOpen(object):
def __init__(self, path):
self.path = path
# 进入文件时触发
def __enter__(self):
self.file = open(self.path)
print("文件打开....")
return self
# 离开文件时触发
def __exit__(self, exc_type, exc_val, exc_tb):
print("文件关闭")
# print(exc_type,exc_val,exc_tb)
self.file.close() # 关闭文件
return True
with MyOpen('a.txt') as f:
print(f.file.readline())
# f.file.readline() # 文件已经关闭了,不能读
三、__str__转字符串时触发__del__删除时触发
str:再转换字符串时触发,转换结果就是该函数的返回值
使用场景:利用该函数自定义,打印格式
del :
执行时机:手动删除时立马执行,或者程序运行结束时自动执行
使用场景:当你的对象使用过程中,打开了不属于解释器的资源;例如,文件,网络端口
1.__str__例子:
1.# __str__例子:
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
# 自定义打印输出
return "这是一个person对象 name:%s age:%s" % (self.name, self.age)
p = Person("jack", 20)
print(p)
__del__例子:
2.# __del__例子:
class A:
def __init__(self, name):
self.name = name
def __del__(self):
print('删除时触发')
# 删除时关闭
def __del__(self):
self.file.close()
jeff = A('jeff')
del jeff
# jeff.name # 已经删除,无法访问了
四、匿名函数
匿名函数lambda:没有名字的函数
特点:
临时存在,用完就销毁
匿名函数通常不会单独使用,配合内置函数一起使用
lambda x,y : x+y
解释:左边的相当于函数的形参,右边相当于函数的返回值
1.求和普通方法
def my_sum(x, y):
return print(x+y)
my_sum(1, 2)
2.匿名函数配合内置求和:
res = (lambda x, y: x+y)(11, 20)
print(res)
二:比较薪资,返回人名:
k = {'jeff': 8000,
'nick': 1000,
'tank': 3000,
'mary': 10000,
def index(name):
return k[name]
print(max(k, key=index)) # 函数返回什么比较什么
# max内置函数,第一步:拿到字典key(jeff)
第二步,把key传给index函数
第三步,执行index(jeff),返回字典k[jeff],5000
第四步,依次拿到5000,1000,3000,10000,进行比较
第五步,返回最大值对应的人名
"""
2.把index写成匿名函数:
print(max(k, key=lambda name: k[name]))
print(min(k, key=lambda name: k[name]))
三、补充ascll码表:
"""
A-Z 65-90
a-z 97-122
"""
print(chr(122)) #查看ascll码对应的值
五、包
包:里面有很多工具,供使用者调用
作为一个包的设计者来说:
1.当模块的功能特别多的时候,应该份文件管理
2.每个模块之间为了避免后期改名的问题,应该使用相对导入
站在包的开发者 如果使用绝对路径来管理自己的模块 那么它只需要永远以包的路径为基准
(*****)站在包的使用者 必须将包所在的的文件夹路径添加到system path环境变量中
python2 如果要导入包 包下面不许要有__init__.py文件,否则报错
python3如果要导入包 包下面没有__init__.py文件也不会报错
六、私有属性、私有方法
私有属性、私有方法:
1.让一些关键的数据,变成私有更加的安全
2.不是随意可以更改的
3.在属性,和方法前面加’__‘,变成私有,那么外界就不可以直接调用修改。
4.但是:在类的内部可以定义一个函数,方法调用修改,使用者直接调用这个函数就可以了。这个函数就是接口
5.可以在这个函数、方法加条件限制,而不是任意的改动
**注意:变私有之后外面调不到的原因是,python把私有方法的名字改变了,改成: _类名__方法名
class student:
def __init__(self, name, max):
self.name = name
self.__max = max # 变私有
def max(self, new_max):
if new_max < 300: # 条件
print('修改成功')
self.__max = new_max
print(self.__max)
else:
print('修改失败')
jeff =student('jeff',100) # 定义的初始
jeff.max(200) # 外部调用接口修改,接口调用内部初始修改
结果:修改成功 200
jeff =student('jeff',100)
jeff.max(500)
结果: 修改失败
七、__slots__优化对象内存
slots:原理,给对象声明只有某些属性,从而删除不必要的内存,不能添加新属性
1.优化对象内存
2.限制属性数量
1.__slots__案例:slots使用
import sys
class Person:
__slots__ = ['name'] # 声明名称空间只有name属性
def __init__(self, name):
self.name = name
p = Person('jeff')
print(sys.getsizeof(p))
#结果:48 #####内存减少了8