为了账号安全,请及时绑定邮箱和手机立即绑定

自我的目的是什么?

自我的目的是什么?

蝴蝶不菲 2019-05-22 15:46:09
自我的目的是什么?selfPython 中这个词的目的是什么?我理解它指的是从该类创建的特定对象,但我不明白为什么它明确需要作为参数添加到每个函数。为了说明,在Ruby中我可以这样做:class myClass    def myFunc(name)         @name = name    endend我很容易理解。但是在Python中我需要包括self:class myClass:     def myFunc(self, name):         self.name = name谁能跟我说说这个?这不是我在(无可否认有限的)经历中遇到的事情。
查看完整描述

5 回答

?
鸿蒙传说

TA贡献1865条经验 获得超7个赞

我将演示不使用类的代码:

def state_init(state):
    state['field'] = 'init'def state_add(state, x):
    state['field'] += xdef state_mult(state, x):
    state['field'] *= xdef state_getField(state):
    return state['field']myself = {}state_init(myself)state_add(myself, 'added')state_mult(myself, 2)print( state_getField(myself) )
    #--> 'initaddedinitadded'

类只是一种避免一直传递这种“状态”的东西的方法(以及其他很好的东西,比如初始化,类组合,很少需要的元类,以及支持自定义方法来覆盖运算符)。

现在让我们使用内置的python类机器演示上面的代码,以显示它是如何基本相同的。

class State(object):
    def __init__(self):
        self.field = 'init'
    def add(self, x):
        self.field += x    def mult(self, x):
        self.field *= x

s = State()s.add('added')    # self is implicitly passed ins.mult(2)         # self is implicitly passed inprint( s.field )


查看完整回答
反对 回复 2019-05-22
?
子衿沉夜

TA贡献1828条经验 获得超3个赞

您需要使用的原因self.是因为Python不使用@语法来引用实例属性。Python的决定做方法的方式,使该实例该方法属于可通过自动,但不接受自动:方法的第一个参数是实例的方法被调用。这使方法与函数完全相同,并留下实际名称以供您使用(虽然self是惯例,当您使用其他东西时,人们通常会对您不满。)self对代码来说并不特殊,它只是另一个对象。

Python可以做其他事情来区分普通名称和属性 - 像Ruby这样的特殊语法,或者需要像C ++和Java那样的声明,或者可能是更不同的东西 - 但它没有。Python的所有内容都是为了使事情变得明确,让它显而易见的是什么,虽然它并不是完全在任何地方完成,但它确实是为了实例属性。这就是为什么分配一个实例属性需要知道要分配的实例,这就是它需要的原因self.


查看完整回答
反对 回复 2019-05-22
?
哆啦的时光机

TA贡献1779条经验 获得超6个赞

我们来看一个简单的矢量类:

class Vector:
    def __init__(self, x, y):
        self.x = x
        self.y = y

我们想要一个计算长度的方法。如果我们想在类中定义它会是什么样子?

    def length(self):
        return math.sqrt(self.x ** 2 + self.y ** 2)

当我们将它定义为全局方法/函数时,它应该是什么样子?

def length_global(vector):
    return math.sqrt(vector.x ** 2 + vector.y ** 2)

所以整个结构保持不变。我怎么能利用这个呢?如果我们假设我们没有length为我们的Vector类编写方法,我们可以这样做:

Vector.length_new = length_global
v = Vector(3, 4)print(v.length_new()) # 5.0

这是因为第一个参数length_global,可以重新用作self参数length_new。如果没有明确的话,这是不可能的self


理解显式需求的另一种方法self是查看Python添加一些语法糖的位置。当你记住,基本上,一个电话就像

v_instance.length()

内部转变为

Vector.length(v_instance)

很容易看到self适合的位置。你实际上并没有在Python中编写实例方法; 你写的是类方法,它必须将实例作为第一个参数。因此,您必须明确地将实例参数放在某处。


查看完整回答
反对 回复 2019-05-22
?
月关宝盒

TA贡献1772条经验 获得超5个赞

假设您有一个类ClassA,其中包含一个methodA定义为的方法:

def methodA(self, arg1, arg2):
    # do something

并且ObjectA是这个类的一个实例。

现在ObjectA.methodA(arg1, arg2)调用时,python会在内部将其转换为:

ClassA.methodA(ObjectA, arg1, arg2)

self变量是指对象本身。


查看完整回答
反对 回复 2019-05-22
  • 5 回答
  • 0 关注
  • 740 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信