空字符串注意
>>> if ' ':
... print 'Not False'
...
Not False
>>> if '':
... print 'Not False'
...
类属性实例属性
def get(*agrs):
return "global func abc"
def i():
pass
class A(object):
__getattr__ = get
bound_func = i
def f1(self):
pass
a = A()
print a.bound_func
# <bound method A.i of <__main__.A object at 0x7f64a9a2f790>>
a.i = i
print a.i
# <function i at 0x7f64a9a30d70>
a.i = i
仅仅是将全局函数 i 作为实例 a 的属性。
而在类中定义类属性 bound_func = i
,类生成实例后会成为 Bound function
。
类中使用全局作用域
class MainClass(object):
# func = abc #: error name 'xxx' is not defined
def __init__(self):
self.func = abc
self.message = message
def abc():
pass
message = "This is a message"
a = MainClass()
print a.func
print a.message
是可以执行成功的,即使函数和变量定义在类下面,但是类还是能成功生成实例,并且把它们作为实例属性。
不过如果不是放在实例的初始化特殊方法 __init__
中,而是作为类变量,那么会报熟悉的 name 'xxx' is not defined
。必须把函数和变量的定义放在类上面。
懒得深究!个人猜测,Python是动态语言,执行时会自上而下扫描整个文件。探测到类属性的定义,变量的定义在类之下,便会找不到变量。但是 __init__
为实例的构造方法,实例化类时才会调用,所以实例化的时候,Python已经扫描过了整个文件,故不会找不到变量。