类的定义
定义类成员函数时,必须带有self参数,通过这个参数访问类的对象实例(object instance)。
类的定义,其实就是定义了代码块。这个代码块中可以定义变量、函数,也可以定义语句。
类的成员变量是public,使用双下划线开头命名的变量,为private类型(这只是一种convention,其实还是可以通过其它方式访问,Python中没有绝对的private访问控制)。
在类中定义变量的时候,要区分:
- class varialbe -- 在类中定义,被所有实例共享
- instance variable -- 在类的初始化函数中定义
下面两种调用方式是相同的:
- dog.getcolor(d)
- d.getcolor()
>>> class dog:
m_color = "red"
def shout(self, words):
print("a dog is saying:", words)
def setcolor(self, color):
self.m_color = color
def getcolor(self):
print("color is:", self.m_color)
>>> d = dog()
>>> d.getcolor()
color is: red
>>> d.setcolor("yellow")
>>> d.getcolor()
color is: yellow
>>>
继承
格式:class suclassname(superclassname)
对 overrided 的函数,总是采用动态绑定的方式。如果要实现静态绑定调用,需要使用 name mangle 机制。
如果多个超类中定义了相同的方法,先继承的那个类中定义的生效。
>>> class homedog(dog):
def shout(self, words):
print("it is a homedog")
>>> hd = homedog()
>>> hd.shout("home")
it is a homedog
>>>
类相关函数
Issubclass()
Isinstance()
Hasattr()
Getattr()
Setattr()
Class.__bases__
Class.__class__
Class.__dict__
>>> issubclass(homedog, dog)
True
>>> homedog.__bases__
(<class '__main__.dog'>,)
>>> isinstance(hd, homedog)
True
>>> hd.__class__
<class '__main__.homedog'>
>>> hasattr(d, "m_color")
True
>>> hasattr(d, "m_eye")
False
>>> getattr(d, "m_color")
'red'
>>> setattr(d, "m_color", "green")
>>> getattr(d, "m_color")
'green'
Iterator
class必须支持__iter__()函数,返回一个iterator对象,这个对象有next()方法。遇到结束时,返回异常 StopIterator。