zzxworld

Python class 类对象学习总结

Python class 类对象学习总结

类(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,以及两个类函数:setNamegetComment。这里有两点需要注意:

  1. 给类属性设置默认值时尽量避免使用列表,字典,或是类对象等可变数据类型。和在函数参数中使用这些类型数据时一样,可能会导致一些异常结果,或是导致内存泄漏。
  2. 类函数的第一个参数必须为 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]