Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/364.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_Self - Fatal编程技术网

python和使用';自我';在方法上

python和使用';自我';在方法上,python,self,Python,Self,根据我的阅读/理解,“self”参数与“this”类似 这是真的吗 如果它是可选的,如果self没有“传递到方法中”,您会怎么做?在类中,需要一个self变量(或cls用于类方法)。但你想称之为你的决定。如果您愿意,您可以将其称为this classmethod是一种将class作为第一个参数而不是实例获取的方法。可以在不传递实例的情况下调用它。 i、 e.使用classmethod您可以: SomeObject.some_class_method() 而一个普通的方法需要你去做 SomeOb

根据我的阅读/理解,“self”参数与“this”类似

这是真的吗


如果它是可选的,如果self没有“传递到方法中”,您会怎么做?

在类中,需要一个
self
变量(或
cls
用于类方法)。但你想称之为你的决定。如果您愿意,您可以将其称为this

classmethod
是一种将
class
作为第一个参数而不是实例获取的方法。可以在不传递实例的情况下调用它。 i、 e.使用
classmethod
您可以:

SomeObject.some_class_method()
而一个普通的方法需要你去做

SomeObject().some_normal_method()
or
SomeObject.some_normal_method(instance)

是的,它也有类似的用法。请注意,它是一个位置参数,您可以随意调用它;然而,有一种强烈的习惯称之为
self
(而不是
this
或其他任何东西)。对于可用的实例方法,必须有一些位置参数;它不是可选的。

self
,只需显式传递它并显式使用它引用类方法/属性即可

它在类方法中不是可选的。如果尝试在没有至少一个参数(即
self
参数)的情况下定义classmethod,则会出现
TypeError


但是,你可以称它为“<代码> > > >代码>,但我从未见过其他东西。

< P> <代码>“自我/代码>”是指方法调用的对象,非常类似于C++中的<>代码> <代码>。但是重要的是,
self
仅仅是一种约定,您可以随意命名它并传递子类的实例。

Python的乐趣

这在某种程度上是正确的。方法被绑定到它们所属的对象实例。当你看到

def一些函数(self、foo、bar)

当你呼叫时,自我的传递有时是隐含的,例如:

def type_to_display(type):
    """Converts a pass type to the full written pass type."""
    return list((pair[1] for pair in Pass.TYPE_CHOICES if pair[0] ==      
                          type[0:1].upper()))[0]                          
type_to_display = staticmethod(type_to_display)      
obj.some\u func(foo\u val,bar\u val)

这等于(假定obj属于
MyClass
)的

MyClass.some\u func(obj,foo\u val,bar\u val)

由于该方法绑定到
obj
,因此将填充
self
参数。这是Python的一部分,明确了它的含义。在其他语言中,
这个
只是突然出现在范围内,在Python中有一些关于这是如何发生的

您还可以传递方法,并在不从绑定上下文调用时手动传递它们
self

:

将继续打印hello world,直到时间结束

调用一个方法时会发生什么?您可能已经注意到,调用x.f()时没有使用上述参数,即使f()的函数定义指定了>参数。争论发生了什么?当然,当调用需要参数的函数>时,Python会引发一个异常,即使该参数实际上没有被>使用

实际上,您可能已经猜到了答案:方法的特殊之处在于>对象作为函数的第一个参数传递。在我们的示例中,调用x.f()与MyClass.f(x)完全等价。通常,使用n个参数的列表>调用方法等同于使用参数列表调用相应的函数,该参数列表是通过在第一个参数之前插入方法的对象创建的>


self
this
非常相似,但是,在Python中,名称
self
只是一种约定,可以命名为任何其他名称。该变量以您在函数原型中调用的任何变量命名(
def function(whatever,params…):

例如方法,
self
实际上是必需的。对于类或静态方法,您需要指定它们应该被视为类或静态方法,然后不需要
self
。例如:

def type_to_display(type):
    """Converts a pass type to the full written pass type."""
    return list((pair[1] for pair in Pass.TYPE_CHOICES if pair[0] ==      
                          type[0:1].upper()))[0]                          
type_to_display = staticmethod(type_to_display)      
您永远无法以不传入self的方式使用实例方法。例如,如果我有一个
car
类的
my_car
实例,并且我使用
car
类的
drive
实例方法,那么
my_car
实例将作为第一个参数(
self
)隐式传递到
drive
方法中


你应该重新措辞。是不同的。不,在Python中是不同的。@Matthew Flaschen是正确的。类方法接收对类的引用作为其第一个参数,而静态方法没有必需的参数。“它必须在那里”可能会向未初始化的人暗示它是
self
。我想澄清一下,第一个参数必须在那里,并且将指向对象的一个实例。按照惯例,它被称为
self
,但如果你为一个模糊编码竞赛编写代码,你可以称它为不同的东西。
class Car:
    def drive(self):
        self.do_some_stuff()

my_car = Car()
my_car.drive() # actually calls Car.drive(my_car)