类(class)是一种类似于函数的代码封装方式。相比函数,它的维度和概念更加丰富。函数通常只包含一段实现某个具体功能的代码,而类则是可以把一组函数包含到一起,实现更加复杂的功能逻辑。
创建一个类
Python 和大多数编程语言一样,使用 class
关键字定义类:
class Person:
pass
上面代码定义了一个名为 Person
的类。不同于函数名称小写开头的命名方式,类通常以大写字母开头。pass
语句是一个占位语句,放在这里表示这是一个什么功能都没有的空类。
跟函数定义一样,紧挨着类名的第一行代码如果为字符串,会被作为类的文档字符串:
class Person:
'''人物对象'''
pass
类可以定义自己的属性和函数:
class Person:
'''人物对象'''
# 人物说明的格式文本
comment_text = '{}是个人'
def setName(self, name):
'''设置人物名称'''
self.name = name
def getComment(self):
'''获取人物说明'''
return self.comment_text.format(self.name)
上面的类中,定义了一个类属性:comment_text
,以及两个类函数:setName
和 getComment
。这里有两点需要注意:
- 给类属性设置默认值时尽量避免使用列表,字典,或是类对象等可变数据类型。和在函数参数中使用这些类型数据时一样,可能会导致一些异常结果,或是导致内存泄漏。
- 类函数的第一个参数必须为
self
关键字,这是 Python 语言的约定。
Python 类有一个特殊名称的函数:__init__
,它会在类初始化时自动运行:
class Person:
'''人物对象'''
# 人物说明的格式文本
comment_text = '{}是个人'
def __init__(self, name):
'''设置人物名称'''
self.name = name
def getComment(self):
'''获取人物说明'''
return self.comment_text.format(self.name)
私有变量
Python 类没有提供严格意义上的私有变量定义方式,所以可以理解为 Python 类其实不存在私有变量。不过在实际代码编写中,又需要这么一个概念的属性。所以大家都约定成俗的有了一个定义私有变量的约定:使用下划线开头的变量代表是私有变量。
class Person:
'''人物对象'''
_comment_text = '{}是个人'
def __init__(self, name):
'''设置人物名称'''
self.name = name
def _formatComment():
'''格式化人物说明'''
return self._comment_text.format(self.name)
def getComment(self):
'''获取人物说明'''
return self._formatComment()
不论是类的属性,还是函数,只要以下划线开头,就代表只应该在内部使用。
类的继承
Python 类支持通过继承的方式来扩展类的功能。继承类的方式是在类名后使用括号和要继承的类名:
class Male(Person):
'''男性人物对象'''
_comment_text = '{}是个男人'
上面的例子中,Male
类通过继承 Person
类的方式,获得了和 Person
类一样的属性和函数。而且根据需要重写了 _comment_text
类属性,以很少的代码完成了自定义的目的。
另外值得一提的是,Python 类支持多重继承:
class Tom(Male, Engineer, Wealthy):
pass
可迭代类
可迭代类可以让类对象支持 for ... in ...
循环控制语句,像使用列表一样迭代访问类的属性数据。使用 __iter__
这个特殊类函数可以简单实现一个可迭代类:
class Group:
def __init__(self, *person):
self.people = person
def __iter__(self):
return iter(self.people)
然后就可以这样来使用了:
people = Group(Person('张三'),
Person('李四'),
Person('王五'),
Person('赵六'))
for person in people:
print(person.getComment())
另外一个实现方法是通过 __next__
这个特殊类函数,由自己来控制每次循环的取值:
class Group:
def __init__(self, *person):
self.people = person
self.offset = 0
self.total = len(person)
def __iter__(self):
return self
def __next__(self):
self.offset = self.offset + 1
if self.offset > self.total:
raise StopIteration
return self.people[self.offset - 1]