1. self
通常在写class的时候,定义多个方法,只需要self.一下这个方法名就可以调用和执行这个方法,这实际上是一个python的内部寻址机制,叫做命名空间检索。
编写class的子方法时,必须要用self,才能持续传递命名空间,也就是说只有用了self传递,才能调用子方法。
# -.- coding:utf-8 -.-
# __author__ = 'zhengtong'
class Person:
def __init__(self, name):
self.name = name
def meet_someone(self):
print "咦,那有个人,手里有根烟,过去找他拿火"
def say_hello(self):
print "兄弟你好,我叫{0}".format(self.name)
def ask_for_fire(self):
print "来个火,我抽跟烟,忘记带火了,谢谢"
def show(self):
print '查看self是个什么{0}\n\n\n'.format(dir(self))
self.meet_someone()
self.say_hello()
self.ask_for_fire()
s = Person("李四")
s.show()
输出结果
查看self是个什么['__doc__', '__init__', '__module__', 'ask_for_fire', 'meet_someone', 'name', 'say_hello', 'show']
咦,那有个人,手里有根烟,过去找他拿火
兄弟你好,我叫李四
来个火,我抽跟烟,忘记带火了,谢谢
通过利用自省工具dir() , 打印出来self,可以看到完整的类命名空间里面都有些啥,也就是说其实写class的时候不传self,那你是得不到这些可操作对象的。
2. 命名空间
命名空间是啥意思?
答: 命名空间是一个以字典形式保存变量名的一个特殊变量;这个特殊变量被python内部机制调用,通过这个特殊变量python就可以找到你定义的变量了,
比如说我创建一个x.py文件,然后定义一个hello变量。对于python而言,x.py自身拥有一个内置命名空间和一个全局命名空间,全局该命名空间中包含了一个hello的变量.
# vim x.py
# -.- coding:utf-8-.-
hello = 'a'
在比如说在x.py文件中,定义一个cigarette函数。这个时候对于python而言, 就拥有了三个命名空间,一个是内置命名空间,一个是全局命名空间,一个是专属于cigarette函数的命名空间.
# vim x.py
# -.- coding:utf-8-.-
hello = 'a'
def cigarette():
s = "20"
return "一包烟有{0}支香烟".format(s)
在比如说在x.py文件中,定义一个Animal类。这个时候对于python而言,就拥有了四个命名空间,一个是内置命名空间,一个是全局命名空间,一个是专属于cigarette函数的命名空间,一个是Animal类的命名空间.
# vim x.py
# -.- coding:utf-8-.-
hello = 'a'
def cigarette():
s = "20"
return "一包烟有{0}支香烟".format(s)
class Animal:
s = "dog"
4. 命名空间寻址顺序(LEGB原则)
1. 本地(L)
2. 函数、类(E)
3. 全局(G)
4. 内置(B)