Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中的无类方法对任何事情都有用吗?_Python_Class_Methods - Fatal编程技术网

Python中的无类方法对任何事情都有用吗?

Python中的无类方法对任何事情都有用吗?,python,class,methods,Python,Class,Methods,我刚刚注意到,您可以在Python中执行此操作: def f(self): print self.name class A: z=f name="A" class B: z=f name = "B" 换句话说,f()的行为类似于未在任何类上定义的方法,但可以附加到一个类上。当然,如果它期望它所附加到的对象上的方法或字段不存在,那么它将产生运行时错误 我的问题:这有用吗?它有目的吗?是否存在解决问题的情况?也许这是定义接口的一种方式?有趣的事实: p

我刚刚注意到,您可以在Python中执行此操作:

def f(self):
    print self.name

class A:
    z=f
    name="A"

class B:
    z=f
    name = "B"

换句话说,
f()
的行为类似于未在任何类上定义的方法,但可以附加到一个类上。当然,如果它期望它所附加到的对象上的方法或字段不存在,那么它将产生运行时错误


我的问题:这有用吗?它有目的吗?是否存在解决问题的情况?也许这是定义接口的一种方式?

有趣的事实:

  • python中的函数是一种类型:

    type(f)  # prints <type: function>
    
    type(f)#打印
    
  • 所以,函数是一个可调用的实例,所以它可以插入任何地方

  • 它可用于使函数可移植并模拟即插即用功能

  • 这在开发过程中非常方便-用于尝试不同的逻辑(通过插入不同的函数)

  • 这提供了对逻辑的抽象,因为我们可以用导入的函数替换类方法


  • 虽然,我怀疑你将如何使用它来模拟接口

    因为函数对象有uuu get_uuu(…)方法,所以它是一个非数据描述符

    当您在类a中定义一个方法时,它只是一个函数对象

    In [78]: class A(object):
       ....:     def f1(self):
       ....:         pass
       ....: 
    
    In [79]: A.__dict__["f1"]
    Out[79]: <function f1 at 0x0D39A070>
    
    因此,您的代码几乎与以下代码相同:

    class A:
        def z(self):
            print self.name
        name="A"
    

    请阅读

    中的详细信息是的,它很有用,而且确实有作用,但必须这样做也很少见。如果你认为你需要在定义后补课,你就应该停下来考虑一下它是否真的是最好的方式。 一种情况是猴子修补。我已经在一个大型的Plone系统中完成了这项工作,其中一些方法需要一些小的调整,但是没有任何简单的方法可以正常地覆盖这些行为。在您有一个复杂库的情况下,它提供了一种简单的方法来注入新的或修改的行为,而无需更改原始库

    另一种突然浮现在脑海中的情况是,当您需要许多可以自动生成的方法时。e、 g.数据驱动测试

    def createTest(testcase, somedata, index):
        def test(self):
             "Do something with somedata and assert a result"
        test_name = "test_%d" % index
        setattr(testcase, test_name, test)
    
    for index, somedata in enumerate(somebigtable):
        createTest(MyTestCase, somedata, index)
    
    当MyTestCase是unittest.TestCase时,您可以使用一个测试来检查所有数据,但它会在第一次失败时停止,您需要尝试找出哪一行数据失败。通过动态创建这些方法,所有测试将分别运行,测试名称将告诉您哪个测试失败(上面的原始代码实际上构建了一个更具意义的名称,其中包括一些数据和索引)

    您不能在类的主体内这样做,因为在定义完成之前,无法引用类本身或其字典。但是,您可以对元类执行类似的操作,因为它允许您在创建类之前修改类dict,有时这是一种更干净的方式来执行相同的操作


    另一件需要注意的事情是,在某些情况下,这是行不通的。某些
    \uuuuuxxx\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。另外,如果使用元类,有时额外的函数将不会得到元类作为类定义的一部分对属性的任何处理。

    是的,但是这个习惯用法对任何东西都有用吗?有趣!这还暗示另一个值可能正在将对类不重要的方法的定义移动到其他地方。显然是在特殊情况下。
    In [82]: A.f2 = lambda self: id(self)
    
    In [83]: A().f2()
    Out[83]: 221189392
    
    class A:
        def z(self):
            print self.name
        name="A"
    
    def createTest(testcase, somedata, index):
        def test(self):
             "Do something with somedata and assert a result"
        test_name = "test_%d" % index
        setattr(testcase, test_name, test)
    
    for index, somedata in enumerate(somebigtable):
        createTest(MyTestCase, somedata, index)