Python 方法重写?

Python 方法重写?,python,python-3.x,Python,Python 3.x,我看到了这段代码: def g(x,y): return x+y def g(x,y): return x*y x,y=6,7 print (g(x,y)) 输出明显是42,但对我来说不是42。有人能解释一下这种行为吗?我想这是方法重写,但我仍然没有得到这里的流程。问题在于函数定义的顺序 从技术上讲,这不是方法重写,因为它需要类继承,而是python如何声明和引用函数的结果 声明函数时,python将对该函数的引用存储在以函数定义命名的变量中。e、 g.对于def foo,变量

我看到了这段代码:

def g(x,y):
    return x+y
def g(x,y):
    return x*y
x,y=6,7
print (g(x,y))

输出明显是42,但对我来说不是42。有人能解释一下这种行为吗?我想这是方法重写,但我仍然没有得到这里的流程。

问题在于函数定义的顺序

从技术上讲,这不是方法重写,因为它需要类继承,而是python如何声明和引用函数的结果

声明函数时,python将对该函数的引用存储在以函数定义命名的变量中。e、 g.对于def foo,变量应为foo:


通过两次声明函数,该变量的值将被第二个定义覆盖。

当您定义函数并重新定义它时,它将使用您定义的最后一个函数,即使参数不同:

def g(x,y):
    return x+y
def g(x,y):
    return x*y
x,y=6,7
print (g(x,y))

def hello():
    return 'hello'
def hello():
    return 'bye'

print hello()

def withone(word):
    return word

def withone():
    return 1==1

print withone('ok')
输出:

42
bye
TypeError: withone() takes no arguments (1 given)
Python中的函数名更像是简单变量:

def hello():
    return 'hello'

iamhello = hello # bind to the old one

def hello():
    return 'bye'

print hello() # here is the new guy

print iamhello()
输出:

bye
hello

顺序很重要,若名称相同,则定义的最后一个函数是processing。在你的情况下,它是

def g(x,y):
    return x*y

g只是一个变量。它引用的对象是函数这一事实在Python中并不特殊,因此您可以根据需要分配和重新分配它。在本例中,函数定义的第二个赋值只是将存储在其中的对象替换为另一个对象。

Python脚本自上而下进行解析。 因此,只要变量、函数或类的名称相同,它就会覆盖以前与该名称关联的任何定义

def g(x,z):
    print('first')

def g():
    print('second')

g = 3
print g
print g()
请看这个例子,它将导致“3”的打印输出,然后出现异常:“TypeError:“int”对象不可调用”

名称g首先是一个有两个参数的函数,然后它被重新定义为一个没有参数的函数,然后它被重新定义为一个int。
显然不能调用:

函数和方法与其他任何对象一样都是普通对象。所以在

def g(x, y):
    return x + y

def g(x, y):
    return x * y    
第二个对象g将替代第一个对象,就像下面的对象a一样:

a = 1
a = 2
参数的数量、类型或顺序没有任何区别,因为Python不支持函数/方法重写,也不允许两个函数/方法具有相同的名称。

如果您熟悉也称为匿名\内联函数的函数,这可能会让事情变得更清楚一些

这两个代码块本质上是相等的

def g(x,y):
    return x+y
def g(x,y):
    return x*y

python中的所有内容都被视为对象,无论是函数名还是类名。因此,当我们使用“def”定义函数时,内存分配就完成了。然后python将我们分配给函数的名称指向这个分配的内存位置。因此,如果我们定义一种方法:-

def demo():
    print 'hi'
为方法分配内存,名称“demo”指向其内存位置,如下所示:-

现在,如第二个示例中所述,当您将函数名分配给另一个变量时:-

demo2 = demo # bind to the old one
在这种情况下,分配给demo的内存位置也会分配给demo2。所以demo和demo2都指向同一个位置12506

现在,如果我们修改上面的代码,在下一行中,定义一个同名demo的新方法:-

然后为这个新方法分配一个全新的内存位置12534,现在演示将指向这个新位置12534,而不是指向旧位置12506。但是demo2仍然指向12506的位置


我希望这将使您清楚地了解正在发生的事情以及方法名称是如何被重写的。

您希望它是什么?我的意思是为什么会被重写?为什么答案不仅仅是13?这里没有继承,对吗?当你定义了一个函数g。它存储在名为g的变量中。使用相同名称定义新函数时,此变量将被替换。尝试printidg查看变量引用是否已更改。我没有得到的是在它得到值13并返回它之后,为什么它会继续寻找另一个g。返回的值,为什么不在那里打印,为什么另一个被称为偶数?是的。定义函数本质上是将函数对象分配给同名变量。因此,用相同的名称定义一个新函数,等于为该变量分配一个新函数对象withone示例与此相关如何?请原谅我忘记了添加参数。该示例给出了错误:TypeError:withone不接受任何参数1 Given该输入错误进一步表明接受参数的旧函数已消失:是,因为上一个定义没有参数,所以你不能使用它。你在没有参数的情况下重新定义它。所以,这里没有方法重载的概念?
demo2 = demo # bind to the old one
print id(demo)   # will print 12506
print id(demo2)  # will print 12506
def demo():
    print 'hi'

demo2 = demo # bind to the old one
demo()       # Will print hi

def demo():
    print "hello"

demo()      # Will print hello
demo2()     # Will print hi