私有函数
在python的类中双下划线开头的为私有属性,双下划线开头双下划线结尾的为内置特殊函数。
python中不存在保护函数,有些地方约定把单下划线开头的属性成为保护的,这只是个约定,在python中将其视为公有的。
Name VS Object
Name在python中可以绑定多个object,一个object也可以绑定多个Name alias。在不可变的基本类型(int,string,tuple)中,Name和object几乎感觉不到区别。但是在可变的对象中就会显示特别明显,如下面例子a和b两个Name同时指向一个object,但是通过任何一个进行修改都会修改这个object。Name更像一个指针的用法。
>>> a = [1,2,3]
>>> b = a
>>> b.append(4)
>>> b
[1, 2, 3, 4]
>>> a
[1, 2, 3, 4]
global VS nonlocal
同样是为了说明非local变量但是nonlocal必须在闭包的环境下使用,如下图需要在enclosing的scope_test内部的do_nonlocal函数中用来声明spam不是do_nonlocal()的local变量。但是global则声明的是全局变量,而不是相对概念。下面是nonlocal例子:
def scope_test():
def do_nonlocal():
nonlocal spam
spam = "nonlocal"
spam = "hello"
do_nonlocal()
print(spam)
scope_test()
上面程序输出为:nonlocal
nonlocal和global例子:def scope_test():
spam = "scope_test_spam"
def do_local():
spam = "local"
def do_nonlocal():
nonlocal spam#这里的spam变量是指scope_test范围内有效的spam变量
spam = "nonlocal"
def do_nonlocal2():
nonlocal spam#这里的spam变量是指<span style="color:#ff0000;">scope_test函数范围内</span>有效的spam变量
print('do_nonlocal2:', spam)
def do_global():
global spam #这里的spam变量范围是<span style="color:#ff0000;">整个文件范围</span>的global
print('do_global:', spam)
###函数调用
do_local()
print('do_local:', spam)
do_nonlocal()
print('do_nonlocal:', spam)
do_nonlocal2()
do_global()
print('在函数scope_test执行到最后:', spam)
############
spam = "GLOBAL_SPAM"
scope_test()
#执行结果为
#do_local: scope_test_spam
#do_nonlocal: nonlocal
#do_nonlocal2: nonlocal
#do_global: GLOBAL_SPAM
#在函数scope_test执行到最后: nonlocal
attribute VS method
成员变量和函数重名的时候,attribute会覆盖函数。所以在项目中需要明确函数和属性的命名规则,防止覆盖,出现bug。
成员函数也可以定义在外边,如下所示f1可以单独使用,也可以在类中进行使用。另外self仅仅是一个参数,只不过大家约定起名self,实际编程中可以使用任意的参数。在调用的时候c.f实际执行的是CLS.f(c)
# 在类外边定义的函数,也可以在类的内部进行引用
def f1(self, x, y):
return min(x, x+y)
class CLS:
f = f1
c = CLS()
c.f(3,4)
<完>