zoukankan      html  css  js  c++  java
  • 类中的魔法方法

      在python中有很多魔法方法,常见的__init__(self)就是魔法方法的一种,类绑定对象是自动触发。那就来聊一聊其他的魔法方法。

    __str__方法

      这中方法需要返回值,并且返回值为字符串类型。

    # str 方法
    class A:
        def __str__(self):        # 打印对象self触发。注销是结果1,未注销时结果2
            return '<class A>'
        pass
    a = A()
    print(a)    # 结果1:<__main__.A object at 0x0000026AF987D208> 结果2: <class A>

    __del__方法

      这种方法在删除对象时,程序结束时(类的对象消失)会自动触发

    # del 方法
    class A:
        def __del__(self):    # self删除时触发
            print('aaaa')
        pass
    a = A()
    print(a)

    __call__方法

      在类中定义此函数。对象调用此函数只需要对象名加(),即可调用此函数。

    class A:
        def __call__(self, *args, **kwargs):
            print('aaa')
    a = A()
    a()     # 执行__call__函数 结果:aaa

    __slots__方法

      这方法形式不是一个函数形式(没有def),它可给类划分适合大小的内存存储属性,但是也限制了类的扩展其他属性。

    #  slots方法  
    import sys
    class A:
        __slots__ = ['name']          # 限制类的属性,在这设置,
        def __init__(self, name):
            self.name = name
    a = A('meking')               # 不能添加其他属性,否则报错
    print(sys.getsizeof(a))     # 查看类的内存大小  》》》48

    点语法的实现

      在实现点语法需要getattr,setatter, delattr这几个函数。getattr,在查找某个属性名,无此属性会触发。setattr,在给某个属性名赋值是会触发。delattr,在删除属性名会被触发。getattribute不可与setatter一起使用。它的用法是,已经有点属性值,调用时,它会被触发。

    class A:
        age = 1     # 测试getattribute函数
        def __getattr__(self, key):
            return 'getattr', key
    
        def __setattr__(self, key, value):
            self.__dict__[key] = value   # 类内的属性值与名是以字典键值对的形式绑定
            print('setattr', key, value, self.__dict__[key])
    
        def __delattr__(self, key):
            del self.__dict__[key]
            print('delattr', key)
    
        def __getattribute__(self, key):  # 属性存在,使用.属性名称优先执行此函数
    
            return key, 'getattribute'
    a = A()
    print(a.age)    # 不存在的一个属性,执行getattr函数,并且此函数有返回值,不写为None
    a.name = ''   # .语法绑定值时 执行setattr函数。 无返回值
    del a.name      # 删除属性时。执行delattr函数

    [ ]语法的实现

      这种语法需要关键字getitem, setitem, setitem, delitem。调用属性名对应的值,可以用调用字典的方式。

    class A:
        def __getitem__(self, item):
            print('getitem')
            return 'getitem', item
    
        def __setitem__(self, key, value):
            self.__dict__[key] = value
            print('setitem')
            return self.__dict__[key], value
    
        def __delitem__(self, key):
            print('delitem')
            del self.__dict__[key]
    a = A()
    print(a['age'])   # 类中无此属性名,先执行getitem函数
    a['age'] = 18    # 先执行setitem函数
    del a['age']     # 执行delitem函数

    运算符在对象中的应用

      类之间,对象之间也可以比大小。比值需要依据比值的规则。在gt, lt , eq即可实现。

    class A:
        def __init__(self,name, age):
            self.name = name
            self.age = age
        def __gt__(self, other):       # 对象与对象之间比较,
            if self.age > other.age:   # 比较的标准,依据年龄
                return True
            else:
                return False
    a = A('MEKING', 20)
    b = A('meking', 18)
    print(a > b)

    类中定义迭代器 

    class A:
        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            # 终止循环。不然会死循环
    
    
    print(A(1, 10, 1).__iter__())  # __inter__方法
    
    for i in A(1, 10, 1):         # 迭代取值
        print(i, end=', ')

    类中的上下文管理

    class A:
        def __init__(self, path):  # 传入文件路径
            self.file = open(path)  # 打开文件
        def __enter__(self):
            res = self.file.read()
            return res             # 返回对象本身
        def __exit__(self, exc_type, exc_val, exc_tb):  # exc_type,exc_cal,exc_tb已将捕获
            self.file.close()
            return True
    with A('a.txt') as f:
        print(f)

    多态

      多态是一种概念,在python中满足能够相应同一方法,产生不同结果的都可以称之为多态。在计算字符串,列表,字典的长度都可以使用len()这个方法,但是结果不同,这种就可以成为多态的一种现象。

    其他方法(也很重要)

      isinstance(a, b):实质是判断a这个对象是不是b这个类型的。对象和类之间的判断

      issubclass(a, a),判断类与类之间是否有继承关系。 类与类之间判断

  • 相关阅读:
    JavaScript界面传值与前后台互调
    @requestBody注解的使用
    mybatis动态sql中foreach标签的使用
    mybatis动态SQL中的sql片段
    mybatis动态sql中where标签的使用
    mybatis动态sql中的trim标签的使用
    mybatis动态SQL中的set标签的使用
    SQL-join(inner join)、left join、right join、full join
    Oracle-distinct()用法、count(distinct( 字段A || 字段B))是什么意思?distinct多个字段
    Oracle-where exists()、not exists() 、in()、not in()用法以及效率差异
  • 原文地址:https://www.cnblogs.com/huaiXin/p/11265105.html
Copyright © 2011-2022 走看看