gpt4 book ai didi

Python 方法查找,静态与实例

转载 作者:太空狗 更新时间:2023-10-29 20:28:43 24 4
gpt4 key购买 nike

直到大约一个小时前,我还确信在 python 中 Foo ().bar ()只不过是 Foo.bar (Foo () ) 的简写它将实例作为第一个参数传递。在这个例子中,最后两行(显然)做了同样的事情:

class Foo (object):
def bar (self): print "baz"

qux = Foo ()
qux.bar ()
Foo.bar (qux)

但现在我有一个 Animal 类,它有一个静态方法 populate() 返回人类已知的所有动物的列表。此外,Animal 的每个实例都有一个 populate() 方法,该方法用随机值填充实例的属性。

#! /usr/bin/env python
# -*- coding: utf-8 -*-

import random

animals = [ ("Bella", "cow"), ("Spike", "dog"), ("José", "iguana"), ("Tux", "penguin") ]

class Animal (object):
@staticmethod
def populate (*args): return map (lambda x: Animal (*x), animals)

def __init__ (self, name = None, species = None):
def bar (): self.name, self.species = random.choice (animals)
self.name = name
self.species = species
self.populate = bar

def __repr__ (self): return "%s of species %s" % (self.name, self.species)

print Animal.populate ()
print Animal ("Pinky", "mouse")
qux = Animal ()
qux.populate ()
print qux

代码工作正常,但让我怀疑的是 print Animal.populate (qux)调用了静态填充方法(因此返回了一个列表并且没有填充可怜的 qux)。显然我坚信Foo ().bar ()只不过是 Foo.bar (Foo () ) 的简写是错误的。

这对我提出了各种问题:

  1. 当我调用 Foo ().bar () 时会发生什么?
  2. 当我调用 Foo.bar (Foo () ) 时会发生什么?
  3. 两者之间有内在差异吗?
  4. 我是否遗漏了 python 的一些基本概念?
  5. 如果您必须编写一个类,其静态填充方法执行的操作不同于通过此类的实例调用的填充方法,那么该怎么做?

(是的,它必须是相同的名称。)

最佳答案

关于 Foo().bar()、Foo.bar(Foo()) 和 Foo.bar() 之间的区别(作为答案,因为我昨天注册了,还不能发表评论)——这是因为Python(<3.0) 的“绑定(bind)”和“未绑定(bind)”方法的概念——它严格要求,除了@staticmethod 或@classmethod,方法调用有一个与之关联的实例。没有比你必须记住的东西更容易解释它的方法了。值得庆幸的是,这在 Python 3 中发生了变化——“绑定(bind)”和“未绑定(bind)”方法作为独立事物的概念已经消失,Foo.bar() 对您的示例来说工作得很好。

关于Python 方法查找,静态与实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6207299/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com