看书有的地方没懂,什么是创建类的时候使用聚集?Python

img


创建类的时候从头写,或者通过继承创建我都知道,但是不懂这个聚集是什么意思?

这个也不算专业术语,就把数据“聚集”到一起的文绉绉的代称吧

这里指的是类的不同关系。前文也提到了,“继承”是 is-a 的关系,比如“学生”类是“人”类的子类,“学生” is “人”,继承比较好理解。
而与之相对的就是 has-a 的关系,比如“人”类和“心脏”类就是 has-a 的关系,“人” has “心脏”。
has-a 的关系里,类之间没有继承关系,但是一个类却可以成为另一个类的属性,一个类的方法可以在另一个类的方法中被调用。
has-a 的关系还可以再分两种:“组成Composition”和“聚合Aggregation”。两者区别主要在于实例化的方式不一样,所以类之间的从属关系存在松紧之分。还是拿“人”类和“心脏”类为例,Composition是在实例化“人”类的时候,在“人”类的构造函数里再实例化一个“心脏”类。而Aggregation是先实例化一个“心脏”类,再把它作为一个属性去实例化“人”类。
下面是示例代码:

# Composition
class Heart():
    def __init__(self, beats):
        self.beats=beats

class Person():
    def __init__(self, name, beats):
        self.name=name
        self.heart=Heart(beats)

someone = Person('张三', 100)


# Aggregation
class Heart():
    def __init__(self, beats):
        self.beats=beats

class Person():
    def __init__(self, name, beats):
        self.name=name
        self.heart=beats

heart = Heart(100)
someone = Person('张三', heart)

所以书中的例子是指SortedList这个类里的属性是其他类的实例,所以是 has-a 的 Aggregation关系。比如章节后面的例子里,实例化SortedList类的时候,sequence参数就可能是别的类。

class SortedList:
    def __init__(self, sequence=None, key=None):
        self.__key = key
        assert hasattr(self.__key, "__call__")
        if sequence is None:
            self.__list = []
        elif (isinstance(sequence, SortedList) and
            sequence.key == self.__key):
            self.__list = sequence.__list[:]
        else:
            self.__list = sorted(list(sequence), key=self.__key)