zoukankan      html  css  js  c++  java
  • python __call__() 方法

    python中一切皆对象,函数也是对象,同时也是可调用对象(callable)。
    
    关于可调用对象,我们平时自定义的函数、内置函数和类都属于可调用对象,但凡是可以把一对括号()应用到某个对象身上都可称之为可调用对象,判断对象是否为可调用对象可以用函数 callable
    

      

    # 1、一个类实例要变成一个可调用对象,只需要实现一个特殊方法__call__()。

    class Animal:
    def __init__(self, name, hobby):
    self.name = name
    self.hobby = hobby

    def __call__(self, food):
    print('animal name is %s...' % self.name)
    print('animal name like eat %s...' % food)


    if __name__ == '__main__':
    animal = Animal('cat', 'play')
    # animal.__call__('fish')
    animal('fish')
    print(callable(animal))


    实质上说,这意味着 animal() 与 animal.__call__() 是相同的。注意 __call__ 参数可变。这意味着你可以定义 __call__ 为其他你想要的函数,无论有多少个参数

    # 2、 __call__ 在那些类的实例经常改变状态的时候会非常有效

    class TEST:
        def __init__(self, size, x, y):
            self.x, self.y = x, y
            self.size = size
    
        def __call__(self, x, y):
            """
            改变实体的位置
            :param x:
            :param y:
            :return:
            """
            self.x, self.y = x, y
            print(self.x, self.y)
    
        def test_num(self):
            print(self.x)
    
    
    if __name__ == '__main__':
        test = TEST(1, 2, 3)  # 创建实例
        test(4, 5)  # 实例可以象函数那样执行,并传入x y值,修改对象的x y
        test.test_num()
        """
        结果:
            4 5
            4
        """

    # 3、参考大神链接

    https://www.jianshu.com/p/e1d95c4e1697?utm_source=oschina-app

      

  • 相关阅读:
    fastjson1.2.22-1.2.24 反序列化命令执行实践测试
    Spring boot JdbcTemplate sql注入测试
    java反序列化命令执行测试实践
    SpringBoot 整合mybatis SQL注入漏洞实践
    SpringBoot整合mybatis入门
    python函数默认参数为可变对象的理解
    python笔记
    python
    python面向对象
    ICMP
  • 原文地址:https://www.cnblogs.com/fierydragon/p/12910281.html
Copyright © 2011-2022 走看看