两个关于Python变量与函数的问题

def add(a,b,c):
    result = a + b + c
    return result
x = 1
y = 2
z = 3
add = add(x,y,z)
print add(1, 2, 3)

第一个问题,上述都代码运行出错,因为函数名与变量名冲突,为什么会存在这种冲突?add()分明是一个函数,为什么会被当成变量?

class test():

    def func1(self):
        return 1

    @property
    def func2(self):
        return 2

a = test()
print type(a.func1())
print type(a.func2())

第二个问题,当函数被@property修饰时,函数变为变量,因此上述代码的a.func2()报错,为什么在《flask web开发》的代码:

@auth.before_app_request
def before_request():
    if current_user.is_authenticated():
        current_user.ping()
        if not current_user.confirmed\
                and request.endpoint\
                and request.endpoint[:5] != 'auth.'\
                and request.endpoint != 'static':
            return redirect(url_for('auth.unconfirmed'))
为什么没有报错?
is_authenticated()函数同样被@property修饰,为什么?请各位前辈讲解。
阅读 3.1k
3 个回答

第一个问题, Python是动态语言,你把add这名字重绑定到了add(1,2,3)的结果上,也就是int,但是int不是可调用的,所以自然报错~

def add(a,b,c):
result = a + b + c
return result
x = 1
y = 2
z = 3
# <type 'function'>
print type(add)
add = add(x,y,z)

#<type 'int'>
print type(add)
print add(1, 2, 3)

第二个问题, 报错是因为property装饰器将func2变为了特性,所以不再是一个方法。简单的例子:

class Bar(object):

    @property
    def foo(self):
        print 'foo'

    @foo.setter
    def foo(self, val):
        print 'set foo'

    @foo.deleter
    def foo(self):
        print 'del foo'


b = Bar()
b.foo
b.foo = 4
del b.foo

至于is_authenticated 得看下原型, 看上去就是一个方法

第一个问题

Python是动态语言,一切皆对象,数字也属于对象,变量赋值操作为引用,一个变量只能引用一个对象,一个对象可以被多个变量引用,也可以被对象引用,当对象没有被引用(即,引用数为0时,会被垃圾回收机制回收)。

新手上路,请多包涵

add也是Python的关键字,不能当变量吧/

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题