一、UML
面向对象主要用于软件开发的分析和设计阶段,通常使用UML(统一建模语言)进行建模
统一建模语言并不是软件开发的方法,而是一种描述软件开发过程的图形化标记,UML使用若干种模型来描述软件中开发中的每个重要步骤。
(1)类图(ClassDiagram)。展现了一组对象、接口、协作和它们之间的关系。类图描述的是一种静态关系,在系统的整个生命周期都是有效的,是面向对象系统的建模中最常见的图。
(2)对象图(ObjectDiagram)。展现了一组对象以及它们之间的关系。对象图是类图的实例,几乎使用与类图完全相同的标示。
(3)用例图(UseCaseDiagram)。展现了一组用例、参与者(actor)以及它们之间的关系。用例图从用户角度描述系统的静态使用情况,用于建立需求模型。
(4)交互图。用于描述对象间的交互关系,由一组对象和它们之间的关系组成,包含它们之间可能传递的消息。交互图又分为序列图和协作图,其中序列图描述了以时间顺序组织的对象之间的交互活动;协作图强调收发消息的对象的结构组织。
(5)状态图(StateDiagram)。由状态、转换、事件和活动组成,描述类的对象所有可能的状态以及事件发生时的转移条件。通常状态图是对类图的补充,仅需为那些有多个状态的、行为随外界环境而改变的类画状态图。
(6)活动图(ActiveDiagram)。一种特殊的状态图,展现了系统内一个活动到另一个活动的流程。活动图有利于识别并行活动。
(7)组件图(ComponentDiagram)。展现了一组组件的物理结构和组件之间的依赖关系。部件图有助于分析和理解组件之间的相互影响程度。
(8)部署图(DeploymentDiagram)。展现了运行处理节点以及其中的组件的配置。部署图给出了系统的体系结构和静态实施视图。它与组件图相关,通常一个节点包含一个或多个构建。
二、类和对象
类是一些对象的抽象,隐藏了对象内部复杂的结构和实现。类由变量和函数两部分构成,类中的变量称为成员变量,类中的函数称为成员函数。
类是对客观世界中事物的抽象,而对象是类实例化后的实体。
2.1类的定义
Python使用class关键字定义一个类,类名的首字符一般要大写。类需要把使用的变量和方法组合在一起,这种方法称为封装。
class Fruit:
def __init__(self,name,color):
self.name = name
self.color = color
def grow(self):
print('Friut grow......')
return 0
注意:类的方法必须有1个self参数,但是在方法调用时,可以不传递这个参数。
2.2对象的创建
创建对象的过程称为实例化,当一个对象被创建后,包含3个方面的特性:对象的句柄、属性和方法,对象的句柄用于区分不同的对象,对象的属性和方法与类的成员变量和成员函数相对应。
if __name__ == "__main__":
friut = Fruit('apple','red')
print(friut.name)
print(friut.color)
print(friut.grow())
Python使用约定属性名称来达到这样数据封装的目的,如果属性的名字以两个下划线开始,就表示私有属性,反之,就表示公有属性。类的方法也这样约定。
Python中静态变量称为类变量,类变量可以在该类的所有实例中被共享,当创建新的实例化对象后,静态变量并不会获得新的内存空间,而是使用类创建的内存空间。
练习(实例变量和类变量的区别):
class Fruit:
price = 0
def __init__(self):
self.color = 'red'
zone = 'China'
if __name__ == "__main__":
print(Fruit.price)
apple = Fruit()
print(apple.color)
Fruit.price = Fruit.price+10
print("apple.price:",str(apple.price))
banana = Fruit()
print("banana.price:",str(banana.price))
class Friut:
def __init__(self):
self.__color = 'red'
if __name__ == "__main__":
apple = Friut() #实例化类
print(apple._Friut__color) #通过这样的方式访问类的私有变量
类的内置属性:
class Friut:
def __init__(self):
self.__color = 'red'
class Apple(Friut):
'''this is some of instrction of class'''
pass
if __name__ == "__main__":
fruit = Friut()
apple = Apple()
print('apple.doc',apple.__doc__)
print('apple.dict',apple.__dict__)
print('apple.module',apple.__module__)
print('apple.base',Apple.__bases__) #Apple类的父类
2.3类的方法
Python使用函数staticmethod()或@staticmethod修饰器把普通函数转换为静态方法,要调用静态方法只需要使用类名作为前缀即可。
class Friut:
price = 0 #类变量
def __init__(self):
self.color = 'red'
def getColor(self):
print(self.color)
# @staticmethod
# def getPrice():
# print('BEFORE Friut price:',Friut.price)
@staticmethod
def getPrice(cls):
print('BEFORE Friut price:', cls.price)
# def __getPrice(self):
# Friut.price = Friut.price + 10
# print('AFTER Friut price:',Friut.price)
def __getPrice(cls):
cls.price = cls.price + 10
print('AFTER Friut price:', cls.price)
count = staticmethod(__getPrice)
if __name__ == "__main__":
apple = Friut()
apple.getColor()
Friut.count(apple)
banana = Friut()
Friut.count(banana)
Friut.getPrice(Friut)
2.4内部类的使用