不可否认的是,Python是面向对象的语言,但它是纯的面向对象语言吗?为什么会提出这个问题呢?原因是今天遇到了一个问题,但经过了几个小时的调研,期间也曾经询问过其他人,但得到了错误的答案,还好自己一直没有放弃,最终找到了正确的答案(Practice makes perfect)。
这个问题是什么呢?
dir(1)
['__abs__', '__add__', '__and__', '__class__', '__cmp__', '__coerce__', '__delat
tr__', '__div__', '__divmod__', '__doc__', '__float__', '__floordiv__', '__forma
t__', '__getattribute__', '__getnewargs__', '__hash__', '__hex__', '__index__',
'__init__', '__int__', '__invert__', '__long__', '__lshift__', '__mod__', '__mul
__', '__neg__', '__new__', '__nonzero__', '__oct__', '__or__', '__pos__', '__pow
__', '__radd__', '__rand__', '__rdiv__', '__rdivmod__', '__reduce__', '__reduce_
ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ro
r__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rx
or__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '_
_truediv__', '__trunc__', '__xor__', 'bit_length', 'conjugate', 'denominator', '
imag', 'numerator', 'real']
显而易见的是,对于1而言,它是包含class属性的。但是,如果执行的是1.class,却会报错,结果如下图所示:
错误
之所以报错,其实是因为对于Python来说,会将1.class解析成1.(浮点数)和class(标识符),而这两者之间缺少操作符,所以会报错。
正确的写法是
(1).__class__
正确截图
研究发现,在Python中一切数据都是对象(这点胜于Java等OO语言),但是它并不是一门纯的面向对象语言。为什么说它不是一门纯的面向对象语言呢?是因为Python并不支持面向对象的第一大特性:封装,demo如下所示。
class C(object):
def m(self):
self.a = 1
self.__a = 2
c = C()
c.m()
print c.a
print c.__a #
print c._C__a
如果此时执行,运行结果如下所示:
image.png
但如果我们讲c.__a注释起来,运行结果如下所示:
image.png
所以,Python并不是纯的面向对象语言。