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