类对象:
类对象支持两种操作:属性引用和实例化
属性引用使用Python中的标准语法:obj.name。当类对象被创建时在其命名空间内的所有属性都是有效的
class MyClass:
"""A simple example class"""
i = 12345
def f(self):
return 'hello world'
Myclass.i和Myclass.f是有效的属性引用,分别返回一个整数和函数对象。类的属性也可以被赋值,所以你可以通过赋值改变Myclass.i的值。__doc__也是一个有效的属性,它返回属于这个类的文档字符串:A simple example class
类的实例化使用函数符号。只是将类对象看作一个无参的函数并返回这个类的一个新的实例。
x = MyClass()
创建了类的一个实例并把它赋值给局部变量x
实例化操作创建了一个空对象。许多类需要为创造的实例对象指定一个详细的初始状态,因此一个类需要定义个特别的方法:__init__()
def __init__(self):
self.data = []
当一个类定义了__init__()方法,类的实例化自动调用__init__()为新创建的类的实例。
__init__()方法可以拥有参数,传递给类的实例化的参数会传递给__init__()
>>> class Complex:
... def __init__(self, realpart, imagpart):
... self.r = realpart
... self.i = imagpart
...
>>> x = Complex(3.0, -4.5)
>>> x.r, x.i
(3.0, -4.5)
实例对象:
现在我们可以使用获得的实力对象做什么?
唯一能被实例对象理解的操作时属性引用,有两种有效的属性名,数据属性和方法
数据属性不需要声明,一旦被赋值它们就会存在,就像局部变量一样。x是上面代码创建的实例对象,下面这段代码会打印出16。
x.counter = 1
while x.counter < 10:
x.counter = x.counter * 2
print x.counter
del x.counter
方法是属于对象的函数。一个实例对象的方法名是否有效取决于它的类。根据定义,一个类的所有函数对象属性都定义了对应的实例化方法。所以再例子中,因为Myclass,f时一个函数,所以x.f是一个有效的方法,同样的原理,x.i不是
方法对象:
方法不是必须被立刻调用,它可以被存储被在之后被调用
xf = x.f
while True:
print xf()
再方法调用过程中,实例对象本身被当作函数的第一个参数:x.f() = Myclass.f(x)。一般来说,调用一个具有n个参数的参数列表的方法相当于调用相应的在第一个参数之前插入方法对象的参数列表的函数。
名字和对象:
对象是各具特色的,在不同的作用域中,多个名字可以绑定到同一个对象上,这在其他语言中被成为别名,在处理不可变基本类型时(数字,字符串,元组)可以安全的无视它。可以再涉及到可变对象时,如列表和字典时就可能再Python的语义上具有惊人的效果。这通常对程序有好处,因为别名更像是一个指针。
类和实例变量:
一般来说,实力变量对于每一个实例都时唯一的,类的变量被这个类的所有实例共享
class Dog:
kind = 'canine' # class variable shared by all instances
def __init__(self, name):
self.name = name # instance variable unique to each instance
>>> d = Dog('Fido')
>>> e = Dog('Buddy')
>>> d.kind # shared by all dogs
'canine'
>>> e.kind # shared by all dogs
'canine'
>>> d.name # unique to d
'Fido'
>>> e.name # unique to e
'Buddy'
另一个例子
class Dog:
tricks = [] # mistaken use of a class variable
def __init__(self, name):
self.name = name
def add_trick(self, trick):
self.tricks.append(trick)
>>> d = Dog('Fido')
>>> e = Dog('Buddy')
>>> d.add_trick('roll over')
>>> e.add_trick('play dead')
>>> d.tricks # unexpectedly shared by all dogs
['roll over', 'play dead']
用一个实例变量替代后
class Dog:
def __init__(self, name):
self.name = name
self.tricks = [] # creates a new empty list for each dog
def add_trick(self, trick):
self.tricks.append(trick)
>>> d = Dog('Fido')
>>> e = Dog('Buddy')
>>> d.add_trick('roll over')
>>> e.add_trick('play dead')
>>> d.tricks
['roll over']
>>> e.tricks
['play dead']
参考文献:https://docs.python.org/2/tutorial/classes.html#tut-object