面向对象设计
类:把一类事物的相同的特征和动作整合到一起就是类
类是一个抽象的概念
对象:就是基于类而创建的一个具体的事物(具体的存在),
也是特征和动作整合到一起
对象是由类产生的
实例化:由类生产对象的过程叫实例化,类实例化的结果就是一个对象,或者叫做一个实例
学校类:
特征:name,addr,type
动作:考试,招生,开除
def school(name,addr,type): def init(name, addr, type): sch = { 'name': name, 'addr': addr, 'type': type, 'kao_shi': kao_shi, 'zhao_sheng': zhao_sheng } return sch def kao_shi(school): print('%s 学校正在考试' %school['name']) def zhao_sheng(school): print('%s %s 正在招生'%(school['type'],school['name'])) return init(name,addr,type) s1=school('oldboy','沙河','私立') print(s1) s1['zhao_sheng'](s1)
运行结果:
{'name': 'oldboy', 'addr': '沙河', 'type': '私立', 'kao_shi': <function school.<locals>.kao_shi at 0x00852030>, 'zhao_sheng': <function school.<locals>.zhao_sheng at 0x00852078>} 私立 oldboy 正在招生
面向对象设计(Object oriented design):将一类具体事物的数据和动作整合到一起
OOD不会特别要求面向对象编程语言,事实上,OOD可以由纯结构化语言来实现(比如C)
面向对象编程(object-oriented programming):用定义类+实例/对象的方式去实现面向对象设计(用类的特殊语言实现OOD)
#用面向对象编程独有的语法class去实现面向对象设计 class Dog: def __init__(self,name,gender,type): self.name=name self.gender=gender self.type=type def bark(self): print('一条名字为[%s]的[%s],狂吠不止' %(self.name,self.type)) def yao_ren(self): print('[%s]正在咬人' %(self.name)) def chi_shi(self): print('[%s]正在吃屎' %(self.type)) dog1=Dog('alex','female','京巴') print(dog1.__dict__) # dog2=Dog('wupeiqi','female','腊肠') # dog3=Dog('yuanhao','female','藏獒') # dog1.bark() # dog2.yao_ren() # dog3.chi_shi()
运行结果:
{'name': 'alex', 'gender': 'female', 'type': '京巴'} 一条名字为[alex]的[京巴],狂吠不止
类相关知识:
声明类:
''' class 类名: ’类的文档字符串‘ 类体 ''' #我们创建一个类 class Data: pass #用类Data实例化出一个对象d1 d1=Data() print(Data) print(d1)
<class '__main__.Data'>
<__main__.Data object at 0x011C8FF0>
类是用来描述一类事物,是事物就要有属性,属性分为:
1.数据属性:就是变量
.2.函数属性:就是函数,在面向对象里通常称为方法
注意:类和对象均用点来访问自己的属性
class Chinese: '这是一个中国人的类' party='共产——党' def sui_di_tu_tan(): print('随地吐痰') def cha_dui(self): print('插队') #本质上就是在Chinese.__dict__里找 print(Chinese.party) Chinese.sui_di_tu_tan() print(dir(Chinese)) #只查看属性列表 print(Chinese.__dict__) #查看属性字典 print(Chinese.__dict__['party']) Chinese.__dict__['sui_di_tu_tan']()
运行结果:
*** 随地吐痰 ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'cha_dui', 'party', 'sui_di_tu_tan'] {'__module__': '__main__', '__doc__': '这是一个中国人的类', 'party': '***', 'sui_di_tu_tan': <function Chinese.sui_di_tu_tan at 0x02785FA8>, 'cha_dui': <function Chinese.cha_dui at 0x027F2030>, '__dict__': <attribute '__dict__' of 'Chinese' objects>, '__weakref__': <attribute '__weakref__' of 'Chinese' objects>} *** 随地吐痰
class Chinese: '这是一个中国人的类' party='***' def sui_di_tu_tan(): print('随地吐痰') def cha_dui(self): print('插队') print(Chinese.__name__) #类名 print(Chinese.__doc__) #文档 print(Chinese.__base__) #类的父类 print(Chinese.__bases__) print(Chinese.__module__) #类所在模块 # Chinese # 这是一个中国人的类 # <class 'object'> # (<class 'object'>,) # __main__
对象相关知识:
class Chinese: '这是一个中国人的类' party='***' def __init__(self,name,age,gender): print('__init__函数开始运行') self.mingzi=name self.nianji=age self.xingbie=gender def sui_di_tu_tan(): print('随地吐痰') def cha_dui(self): print('%s插队'%self.mingzi) p1=Chinese('alex','20','female') #类会自动运行__init__函数 实例化就是类名(),返回的是一个对象 print(p1) #p1其实就是self print(p1.__dict__) #p1的字典属性 print(p1.mingzi) #alex # __init__函数开始运行 # <__main__.Chinese object at 0x00B84170> # {'mingzi': 'alex', 'nianji': '20', 'xingbie': 'female'} # alex print(p1.party) #可以理解为函数的作用域,先在__init__函数里(自己的属性字典里)找,找不到再往上一层找 #实例对象可以访问到类属性 #*** Chinese.sui_di_tu_tan() #随地吐痰 Chinese.cha_dui(p1) #alex插队 # p1.sui_di_tu_tan() #报错:实例调用类的方法时,python会自动把实例对象p1作为参数传给函数 # p1.sui_di_tu_tan() # TypeError: sui_di_tu_tan() takes 0 positional arguments but 1 was given p1.cha_dui() #alex插队