我是 Python 的新手。我不明白如何/为什么使用 self
参数:
class Person:
def __init__(self, name):
self.name = name
def sayHi(self):
print 'Hello, my name is', self.name
p = Person('Swaroop')
p.sayHi()
此代码来自 Python 字节。这段代码可以很容易地写成:
def sayHi(self, name):
print 'Hello, my name is', name
p = Person('Swaroop')
p.sayHi()
……对吧?使 name
成为 self
的字段的目的是什么?
最佳答案
看来你把一件不太简单的事情简单化了。 在面向对象的编程中,类是一种声明性构造,它给出了关于对象(该蓝图的表现形式)将包含什么(属性)及其行为方式(成员)的蓝图。 这种类的每个表现形式都称为对象,它具有定义的特定实例。从一个对象通过任何称为成员函数/方法的这种行为属性,我们需要以某种方式引用该对象的实例并记住其中的各个元素,并与其他非成员实体明确区分。
考虑你的例子
class Person:
def __init__(self, name):
self.name = name
def sayHi(self):
print 'Hello, my name is', self.name
此人(Tom、Dick、Harry)的每个实例都是唯一的,并且在每个实例中,为了引用自身,我们需要一些成语,例如(Python 中的 self,C++ 中的 this ptr 或 Java 中的 this)。
因此在 __init__
方法中,当您需要在 Person 的 name
属性与 name
参数之间进行划分时,我们可以轻松地使用 self
。不仅如此,在任何情况下我们都可以通过 self
继续引用这个名字。
创建 Person p=Person('Swaroop')
的实例然后调用 sayHi 与仅调用不属于对象的一部分的函数 sayHi 相比有两个含义
- 函数是 transient 的,没有状态,没有实例,就像这个人说“嘿先生,不管你是谁,说‘你好,我叫 Swaroop’”。这就像在每次运行时,你都必须让一个低能儿知道他的名字,他会忘记下一刻你会遇到他。就像这个人患有Anterograde_amnesia。另一方面,调用名为 Swaroop 的 Person 实例的
sayHi
将意味着类似于物理上存在的 Swaroop 问候他的名字,它具有持久的内存并且永远不会忘记,除非他采用新名字。 - 函数永远不会记得,但会在每次通话结束时忘记。 Person 对象会记住这个名字,直到你明确或隐含地杀死那个人。
如果您有 C++ 的背景并且可能想知道为什么我们需要将额外的参数添加到函数调用中,而在 C++ 中永远不会传递此指针。
坦率地说,确实如此。如果你读过 C++ 调用约定,无论是 X86 还是 X64,this 指针都会通过寄存器 ecx
传递给方法,从而为其自身提供句柄。这在这里更明确,我们故意将当前实例的句柄传递给方法。
关于python - 使用 self 论证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8658012/