zoukankan      html  css  js  c++  java
  • 类python中高级用法

    1. __call__用法

    class Foo:
        def __init__(self):
            print('init')
    
        def __call__(self, *args, **kwargs):
            print('call')
    
    # obj = Foo()
    # obj()
    Foo()()

    类对象后面加()是执行类中的__call__方法。用处稍后说

    2. __int__和__str__方法

    class Foo:
    
        def __init__(self):
            pass
    
        def __int__(self):
            return 1111
    
        def __str__(self):
            return 'hello world'
    
    obj = Foo()
    print(obj, type(obj))
    
    # int,对象,自动执行对象的 __int__方法,并将返回值赋值给int对象
    r = int(obj)
    print(r)
    i = str(obj)
    print(i)


    class Foo:

        def __init__(self,n,a):
            self.name =n
            self.age =a

        def __str__(self):
            return '%s-%s' %(self.name,self.age,)

    obj = Foo('pis', 18)
    print(obj) #print(str(obj)) str(obj)   obj中__str__,并获取其返回值

    3. 运算符重载举例__add__,__del__析构方法

    class Foo:
    
        def __init__(self, name,age):
            self.name = name
            self.age = age
    
        def __add__(self, other):
            return Foo(self.name, other.age)
    
        def __del__(self):
            print('析构方法') # 对象被销毁()时,自动执行
    
    obj1 = Foo('hello', 19)
    obj2 = Foo('world', 66)
    
    r = obj1 + obj2
    # 两个对象相加时,自动执行第一个对象的的 __add__方法,并且将第二个对象当作参数传递进入
    print(r,type(r))

    4. __dict__方法查看封装内容

    class Foo:
        def __init__(self, name,age):
            self.name = name
            self.age = age
            self.n = 123
    
    # obj = Foo('pis', 18)
    #
    # d = obj.__dict__
    # print(d)
    
    # ret = Foo.__dict__
    # print(ret)

    5. __getitem__,__setitem__,__delitem__

    class Foo:
    
        def __init__(self, name,age):
            self.name = name
            self.age = age
    
        def __getitem__(self, item):
            return item+10
    
        def __setitem__(self, key, value):
            print(key,value)
    
        def __delitem__(self, key):
            print(key)
    li = Foo('pis', 18)
    r= li[8] # 自动执行li对象的类中的 __getitem__方法,8当作参数传递给item
    print(r)
    li[100] = "asdf"
    del li[999]


    class Foo:

    def __init__(self, name,age):
    self.name = name
    self.age = age

    def __getitem__(self, item):
    # return item+10
    # 如果item是基本类型:int,str,索引获取
    # slice对象的话,切片
    if type(item) == slice:
    print('调用这希望内部做切片处理')
    print(item.start)
    print(item.stop)
    print(item.step)
    else:
    print('调用这希望内部做索引处理')

    def __setitem__(self, key, value):
    print(key,value)

    def __delitem__(self, key):
    print(key)

    li = Foo('pis', 18)
    li[123]
    li[1:4]

    6. __iter__方法

    class Foo:
    
        def __init__(self, name,age):
            self.name = name
            self.age = age
    
        def __iter__(self):
            return iter([11,22,33])
    li = Foo('pis', 18)
    # 如果类中有 __iter__ 方法,将对象=》可迭代对象,没有则报错
    # 对象.__iter__() 的返回值: 迭代器
    # for 循环,迭代器,next
    # for 循环,可迭代对象,对象.__iter__(),迭代器,next
    # 1、执行li对象的类F类中的 __iter__方法,并获取其返回值
    # 2、循环上一步中返回的对象
    for i in li:
        print(i)
    """

    7. metaclass 作用

    class MyType(type):
        def __init__(self,*args, **kwargs):
            # self=Foo
            print(123)
            pass
    
        def __call__(self, *args, **kwargs):
            # self=Foo
            r = self.__new__()
            self.__init__()
    
    #
    
    class Foo(object,metaclass=MyType):
        def __init__(self):
            pass
    
        def __new__(cls, *args, **kwargs):
            return '对象'
    
        def func(self):
            print('hello world')
    
    obj = Foo()

           在创建类时,obj为Foo对象,而Foo为metaclass对象,默认为type,即metaclass=type,可以用自己创建的类为metaclass,继承type后加上自己的内容即可。

      我们看到的是创建对象时直接执行__init__(),实际上Foo是type的对象,先执行type的__init__,

    然后Foo(),由上面知道是执行type中的__call__方法。在__call__方法中创建的对象,也就是Foo类的__new__和__init__。

  • 相关阅读:
    【http】HTTP请求方法 之 OPTIONS
    【javascript基础】函数前面的一元操作符
    【javascript基础】运算符优先级
    【移动互联网开发】Zepto 使用中的一些注意点 【转】
    【jQuery】IE9 jQuery 1.9.1 报 Syntax error,unrecognized expression 错误
    一月收集几个有用的谷歌Chrome插件
    【Sizzle学习】之关于【初探 jQuery 的 Sizzle 选择器】这篇文章里的小bug
    【第三方类库】underscore.js源码---each forEach 每次迭代跟{}比较的疑惑
    vue-cli脚手架npm相关文件解读(2)webpack.prod.conf.js
    vue-cli脚手架npm相关文件解读(1)webpack.base.conf.js
  • 原文地址:https://www.cnblogs.com/MY0213/p/7824769.html
Copyright © 2011-2022 走看看