Python 一些值得注意的地方

空字符串注意

>>> 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已经扫描过了整个文件,故不会找不到变量。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值