学会写类并不能说明你已经学会了面向对象的思想方法,因为还没能做到类与类之间的关联,也就是无法准确描绘现实世界。类图本身就是对现实世界的抽象,是一种编写程序的逻辑结构。以下是对类图知识点的梳理,以期能够深刻体会面向对象的含义并能灵活运用类图。
可见性:
from __funture__ import print_functiopn
class Flower(object):
def __init__(self, floral=None, leaf=None):
self.floral = floral
self.__leaf = leaf
def flowing(self):
print('flower')
def __grow(self):
print('grow grow')
##在属性或方法前面加上两个下划线__,就可以把其变为私有。
##此处__leaf是私有变量,__grow是私有方法。
泛化关系表现为继承非抽象类。eg.Car现实中存在的,它有两个子类 Suv和Jeep。
from __future__ import print_function
class Car(object):
def __init(self):
self.wheel = ['17']
self.body = 'Independent Suspension'
def run(self):
#get the car started
def horn(self):
print('car is coming')
class Suv(Car):
def horn(self):
print('Suv is coming')
class Jeep(Car):
def horn(self):
print('Jeep is coming')
##类之间的继承:用父类名称代替子类的object,子类可以继承父类的属性和方法。
## Suv和Jeep都是Car的子类。
实现关系表现为继承抽象类。Vehicle 作为一个抽象概念,在现实中并无法直接用来定义对象;只有指明具体的子类(Car、Bicycle)才可以用来定义对象。
from __future__ import print_function
class Vehicle(object):
def run(self):
raise NotImplementedError
class Car(Vehicle):
def run(self):
print('car run run')
class Bicycle(Vehicle):
def run(self):
print('bicycle run run')
#在 Python 中本身是没有接口或是抽象类这种概念的,但是可以通过抛出 NotImplementedError 这个异常来实现.
关联关系通常用来定义对象之间静态、天然的结构。被关联类以类的属性形式出现在关联类中。
class B(object):
pass
class A(object):
def __init__(self):
self.b = B()
#关联对象通常是以成员变量的形式实现的。即被关联类以类的属性形式出现在关联类中。
#此为强调方向的关联关系,A指向B,表示 A 知道 B,B 不知道 A。
自关联:
单向关联:
双向关联:
多重性关联:
聚合关系表示整体由部分构成,但是当整体不存在时部分还是可以存在的。
聚合关系由一个空的菱形箭头表示,菱形箭头指向整体。当公司不存在时,人还是存在的。
class Company(object):
def __init__(self):
self.__employees = []
def add_employee(self, people):
self.__employees.append(people)
class People(object):
def __init__(self, name):
self.name = name
def main():
company = Company()
p1 = People('Mike')
p2 = People('Jack')
company.add_employee(p1)
company.add_employee(p2)
if __name__ = '__main__':
main()
组合关系表示整体由部分构成,但是当整体不存在是部分也不存在,是一种强依赖关系。
组合关系是由一个实心的菱形箭头表示,菱形箭头指向整体,公司有部门组成,当公司不存在了,部门也不存在了。
class Company(object):
def __init__(self):
self.__departments = []
def build_department(self, department):
self.__departments.append(department)
class Department(object):
def __init__(self, title):
self.title = title
def main():
company = Company()
company.build_department(Department('Back End Development'))
company.build_department(Department('Front End Development'))
if __name__ = '__main__':
main()
依赖关系体现为类构造方法及类方法的传入参数,箭头的指向为调用关系;依赖关系除了临时知道对方外,还是 "使用" 对方的方法和属性。
from __future__ import print_function
class People(object):
def __init__(self):
pass
def drive(self, vehicle):
vehicle.run()
class Vehicle(object):
def __init__(self):
pass
def run():
raise NotImplementedError
class Car(Vehicle):
def __init__(self):
pass
def run():
print('car start')
class Bicycle(Vehicle):
def __init__(self):
pass
def run():
print('bicycle start')
def main():
car = Car()
bicycle = Bicycle()
caleb = People()
caleb.drive(car)
caleb.drive(bicycle)
if __name__ == '__main__':
main()