函数对象的一些方法

一、自定义比较对象__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)
  1. __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)

img

2.匿名函数配合内置求和:

res = (lambda x, y: x+y)(11, 20)
print(res)

img

二:比较薪资,返回人名:

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,进行比较
                第五步,返回最大值对应的人名
"""
 

img

2.把index写成匿名函数:

print(max(k, key=lambda name: k[name]))
print(min(k, key=lambda name: k[name]))

img

三、补充ascll码表:

"""
A-Z 65-90
a-z 97-122
"""
print(chr(122)) #查看ascll码对应的值

img

五、包

包:里面有很多工具,供使用者调用

作为一个包的设计者来说:

  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

猜你喜欢

转载自www.cnblogs.com/guyouyin123/p/11346665.html