繁体   English   中英

在Python中定义一个引用self而不称为“self”的类方法是否有用?

is it ever useful to define a class method with a reference to self not called 'self' in Python?

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我正在自学Python,我在Dive into Python 第5.3节中看到以下内容:

按照惯例,任何Python类方法的第一个参数(对当前实例的引用)都称为self 这个参数在C ++或Java中填充了保留字this的作用,但self不是Python中的保留字,仅仅是命名约定。 尽管如此,请不要把它称为self ; 这是一个非常强大的惯例。

考虑到self 不是 Python关键字,我猜测使用其他东西有时会很有用。 有这种情况吗? 如果没有,为什么它不是关键字?

6 个回复

不,除非你想在编写代码之后混淆每个查看代码的程序员。 self不是关键字,因为它是标识符。 可能是一个关键词,事实上它不是一个设计决策。

作为一个侧面观察,请注意Pilgrim在这里犯了一个常见的滥用术语: 类方法实例方法完全不同,这是他在这里所说的。 正如维基百科所说,“方法是一个子程序,它只与一个类(在这种情况下称为类方法或静态方法)或一个对象(在这种情况下它是一个实例方法)相关联。” 。 Python的内置插件包括staticmethod类型,使静态方法和classmethod类型,使类方法,每一个通常用作装饰; 如果你不使用它们,类体中的def会产生一个实例方法。 例如:

>>> class X(object):
...   def noclass(self): print self
...   @classmethod
...   def withclass(cls): print cls
... 
>>> x = X()
>>> x.noclass()
<__main__.X object at 0x698d0>
>>> x.withclass()
<class '__main__.X'>
>>> 

如您所见,实例方法noclass将实例作为其参数,但类方法withclass将获取该类。

因此,使用self作为类方法的第一个参数的名称会非常混乱和误导:在这种情况下,惯例是使用cls ,如上例所示。 虽然这只是一个约定,但是没有真正的理由可以违反它 - 比如说,如果变量的目的是计算狗的数量,那么命名一个变量number_of_cats就不会有了! - )

我见过的唯一一个例子就是在类定义之外定义一个函数,然后将它分配给类,例如:

class Foo(object):
    def bar(self):
        # Do something with 'self'

def baz(inst):
    return inst.bar()

Foo.baz = baz

在这种情况下, self使用起来有点奇怪,因为该函数可以应用于许多类。 我经常看到使用instcls代替。

我曾经有过一些代码(我为这个例子中缺乏创造力而道歉):

class Animal:
    def __init__(self, volume=1):
        self.volume = volume
        self.description = "Animal"

    def Sound(self):
        pass

    def GetADog(self, newvolume):
        class Dog(Animal):
            def Sound(this):
                return self.description + ": " + ("woof" * this.volume)
        return Dog(newvolume)

然后我们输出如下:

>>> a = Animal(3)
>>> d = a.GetADog(2)
>>> d.Sound()
'Animal: woofwoof'

我不知道,如果self的内Dog类将阴影self的内Animal类,所以我选择了做Dog的参考字‘本’来代替。 在我看来,对于那个特定的应用程序,我更清楚。

我认为self被惯例使用而不是Python关键字的主要原因是因为让所有方法/函数以相同的方式获取参数更简单,而不是必须为函数,类方法,实例方法组合不同的参数形式,等等

请注意,如果您有一个实际的类方法(即使用classmethod装饰器定义的classmethod ),则约定是使用“cls”而不是“self”。

因为它是一种约定,而不是语言语法。 有一个Python风格的指南 ,用Python编程的人跟随。 这样,库具有熟悉的外观和感觉。 Python非常强调可读性,而一致性是这一点的重要组成部分。

1 Ruby - 类方法中self的引用

在RubyMonk上执行此代码: 代码通过,但自变量的使用对我来说有点模棱两可。 您可以在show方法中使用self轻松取代to_s并获得相同的结果。 有人可以解释两种插值之间的区别以及为什么/如何使用自我? 此外,如果没有方法to_s,代码将返回代理。 在这里定义to_s有什么 ...

2 在类方法中定义的python函数可以访问self吗?

以此课程为例: 应该允许my_fun访问和更改self.attribute吗? 我可以看到我的编辑器在my_fun中没有self颜色。 这就是我想要实现的: my_method应该调用一个外部函数,它需要一个带有两个参数arg1和arg2的回调。 我想通过允许此回调使用my ...

2019-02-10 22:00:26 1 56   python
3 self 未在类方法参数中定义

我有 4 个类,每个类都有几个方法。 我需要这些方法来使用一些类变量作为参数,例如。 我已经发现这不起作用,因为在创建函数时定义了方法参数,而不是在调用它时,所以我在这里找到了一个解决方法: 但问题是,我有大约 50 个参数(每个方法都没有,而是所有类的所有方法的摘要),使用这种方法,我会得 ...

4 如何在一个类方法中替换self?

我有一个简单的类,编码为: 输出为: 因此,如何实现这种行为(即,从调用的方法返回时将正确更新自身实例)而不必复制所有属性(在实际代码中,这些属性很多,并且每次添加属性时都需要复制)重新检查代码以确保复制完成)? ...

5 Python类方法,何时返回self?

我很困惑何时在类中返回self以及何时返回一个值,该值可能或可能不会用于检查方法是否正确运行。 以上是几个例子。 api_request我知道文本响应是必须的。 但是使用send_message我应该返回什么? 然后转换为dict以检查密钥是否存在,否则引发错误)。 它应 ...

8 在重载类方法时引用self

如果'重载'不是正确的术语,请原谅我... 我想做这样的事情: 正如你所看到的,我试图在参数self._length twice()引用self._length 。 Python虽然不喜欢这个。 我得到NameError: name 'self' is not defined ...

9 python中的实例方法是否需要一个self参数

我建立一个简单的平台游戏的游戏和我使用的是collided_left方法从我Coords在我的课Sprite类。 我在一个属性Sprite类在创建一个对象Coords类,但collided_left方法不具有自参数,所以当我尝试调用它在我Sprite类,我得到一个name 'collided_lef ...

10 方法链接时如何在python类方法中返回self和另一个变量?

我明白我在这里问的可能不是最好的代码设计,但我问的原因是严格的学术。 我试图了解如何使这个概念发挥作用。 通常,我会从一个类方法中返回self以便以下方法可以链接在一起。 我的理解是通过返回 self,我只是返回类的一个实例,以便处理以下方法。 但在这种情况下,我试图弄清楚如何从方法中返回sel ...

2019-12-10 01:39:59 1 1651   python
暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2021 STACKOOM.COM