Python-类

来源:互联网 发布:php好学吗 编辑:程序博客网 时间:2024/05/04 08:03

私有函数

在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 spamspam = "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>的globalprint('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 = f1c = CLS()c.f(3,4)

<完>


0 0
原创粉丝点击