-
有一些变量前面只有一个下划线_name,这样的实例变量外部是可以访问的,但是,按照约定俗成的规定,当你看到这样的变量时,意思就是,“虽然我可以被访问,但是,请把我视为私有变量,不要随意访问”。
-
动态语言的鸭子类型特点决定了继承不像静态语言那样是必须的。静态语言 vs 动态语言
对于静态语言(例如 Java)来说,如果需要传入Animal类型,则传入的对象必须是Animal类型或者它的子类,否则,将无法调用run()方法。
对于 Python 这样的动态语言来说,则不一定需要传入Animal类型。我们只需要保证传入的对象有一个run()方法就可以了:
class Timer(object):
def run(self):
print('Start...')
这就是动态语言的 “鸭子类型”,它并不要求严格的继承体系,一个对象只要 “看起来像鸭子,走起路来像鸭子”,那它就可以被看做是鸭子。
Python 的 “file-like object“就是一种鸭子类型。对真正的文件对象,它有一个read()方法,返回其内容。但是,许多对象,只要有read()方法,都被视为 “file-like object“。许多函数接收的参数就是 “file-like object“,你不一定要传入真正的文件对象,完全可以传入任何实现了read()方法的对象。
-
Python 中的方法可以动态绑定到类或者实例。
-
定义一个特殊的__slots__变量,来限制该 class 实例能添加的属性:
class Student(object):
__slots__ = ('name', 'age') # 用tuple定义允许绑定的属性名称
-
__slots__定义的属性仅对当前类实例起作用,对继承的子类是不起作用的
-
返回闭包时牢记一点:返回函数不要引用任何循环变量,或者后续会发生变化的变量。
-
偏函数: 简单总结functools.partial的作用就是,把一个函数的某些参数给固定住(也就是设置默认值),返回一个新的函数,调用这个新函数会更简单。
-
在一个模块中,我们可能会定义很多函数和变量,但有的函数和变量我们希望给别人使用,有的函数和变量我们希望仅仅在模块内部使用。在 Python 中,是通过_前缀来实现的。
-
注:name两边各有2个下划线__name__有2个取值:当模块是被调用执行的,取值为模块的名字;当模块是直接执行的,则该变量取值为__main__。这样在模块被调用的时候,通过 if 语句就可以避免模块内多余的输出语句等等。