python中类的命名空间和面向对象的诸多问题

原文地址:http://blog.csdn.net/maopaopao2087/article/details/41115963


python中的作用域

以前一直对C++不行,为什么呢 ? 原来最终的原因是没有全局观,就是没有去看作用域的问题,理解命名空间好重要啊。

python中,或者说面向对象编程中,命名空间的概念很重要,也就是各个东西的作用域很重要。python运行坏境有内置的作用域,模块有模块的作用域,函数有函数的作用域,类有类的作用域,类的实例也就是对象有对象的作用域。

# python中: ‘命名空间’ 就是 ‘字典’

下面说一下类的命名空间和对象的命名空间:
以前我真的没有完全理解面向对象的核心意思。类是有自己的命名空间的,在python中类的定义实际上也是一个可执行的代码块。类的对象,也是有自己的命名空间的,比如讲

>>>class A:
  count = 0
  def init(self):
  A.count += 1  # 这里是A.count而不是self.count,类的对象调用此函数时候,操纵的是类命名空间中的count,而对象命名空间中并没有count这个变量。
>>> a = A()
>>> a.init()
>>> a.count
1
>>> a.count1 = ‘hello’
>>> a.count1
hello
>>> 
>>>a.__dict__
{‘count1’:’hello’}

恩,这个例子非常的好,类A是有自己的命名空间的(字典),对象a也是有自己的命名空间的。这里有屏蔽的作用,就是跟局部变量和全局变量一样,对象自己有的时候,就不去类里面去找了,就是把类里面的变量给屏蔽掉了,对象里面没有的话要到类里面去找。
这里,类A中的count变量是属于类的命名空间中的,对象a的命名空间中没有,当a.count时候,首先会在对象的命名空间中找count,然后发现自己的命名空间(字典)中并没有count,然后才到类中去找。a.count1 = ‘hello’这句话的意思是创建一个对象hello,在对象a的命名空间中,创建一个变量来绑定这个‘hello’,count1就属于a对象的命名空间了,不属于类。

再解释一下,为什么命名空间中的方法为什么都用self,作为第一个参数?
因为对象调用方法,比如讲a.init() 这里,a对象首先会在本命名空间中找方法init的,发现没有,才到类的命名空间中去找的,好,现在调用了类中的方法init(),如果执行:A.count += 1,意思是把类空间中的count给加1。而如果执行:self.count += 1 ,那是self.count = self.count + 1,根据赋值的变量是local的和self.count=self.count+1,表明是在对象a的命名空间中创建的变量count,而跟类没关系了。 这点很有意思。也算真正理解了面向对象编程了吧。靠,花了好长时间。

还有一句话:
我们编写的.py文件,可以不用.py结尾的,随便是什么啦,只要是文件就行。 比如讲os,math这些模块就没有以.py结尾。
我们编写的.py文件,也是一个模块!
模块里面定义的变量、导入的模块名、定义的函数名、定义的类名,还有类的对象名都是global的。用globals()函数可以查看模块命名空间中变量。虽然类的对象也是global的,但是如果对象中有的变量的,查找不到的,是到类中去找,找不到就有异常,不到其它地方找。
函数中定义的变量那都是local的,函数中用locals()函数可以查看本函数命名空间中的变量。
类和对象,要查看自己的命名空间,用A.dict 和 a.dict 这个字典变量就可以。而模块中用globals(),函数中用locals()

上面的这些东西很重要,也算是理解面向对象的精髓,暂时可以解决我关于面向对象的所有的疑问。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值