Python入门篇之面向对象(2)
>>> class c(object):
foo = 100
>>> print c.foo
100
>>> c.foo+=1
>>> c.foo
101
方法
>>> class MyClass(object):
def myNoActionMethod(self):
pass
>>> mc = MyClass()
>>> mc.myNoActionMethod()
任何像函数一样对 myNoActionMethod 自身的调用都将失败:
>>> myNoActionMethod() Traceback (innermost last):
File "<stdin>", line 1, in ?
myNoActionMethod() NameError: myNoActionMethod
甚至由类对象调用此方法也失败了。
>>> MyClass.myNoActionMethod() Traceback (innermost last):
File "<stdin>", line 1, in ?
MyClass.myNoActionMethod()
TypeError: unbound method must be called with class
instance 1st argument
绑定(绑定及非绑定方法)
为与 OOP 惯例保持一致,Python 严格要求,没有实例,方法是不能被调用的。这种限制即 Python所描述的绑定概念(binding),在此,方法必须绑定(到一个实例)才能直接被调用。非绑定的方法可能可以被调用,但实例对象一定要明确给出,才能确保调用成功。然而,不管是否绑定,方法都是它所在的类的固有属性,即使它们几乎总是通过实例来调用的。
决定类的属性
要知道一个类有哪些属性,有两种方法。最简单的是使用 dir()内建函数。另外是通过访问类的字典属性__dict__,这是所有类都具备的特殊属性之一。
看一下下面的例子:
>>> class myclass(object):
'myclass class definition' #类定义
myVersion = '1.1' #静态数据
def showVesion(self): #方法
print myclass.myVersion
>>> dir(myclass)
运行结果:
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'myVersion', 'showVesion']
使用:
>>> myclass.__dict__
dict_proxy({'__module__': '__main__', 'showVesion': <function showVesion at 0x0134C9B0>, '__dict__': <attribute '__dict__' of 'myclass' objects>, 'myVersion': '1.1', '__weakref__': <attribute '__weakref__' of 'myclass' objects>, '__doc__': 'myclass class definition'})
从上面可以看到,dir()返回的仅是对象的属性的一个名字列表,而__dict__返回的是一个字典,它的键(keys)是属性名,键值(values)是相应的属性对象的数据值。
结果还显示了 MyClass 类中两个熟悉的属性,showMyVersion 和 myVersion,以及一些新的属性。这些属性,__doc__及__module__,是所有类都具备的特殊类属性(另外还有__dict__)。。内建的 vars()函数接受类对象作为参数,返回类的__dict__属性的内容。
- 上一篇:python3生成随机数实例
- 下一篇:Python入门篇之数字