python学习第六天回顾(面向对象)
| 一、什么是面向对象的程序设计 |
1 面向过程的程序设计的核心是过程(流水线式思维),过程即解决问题的步骤,考虑周全,在特定的时间处理事物 2 优点是:极大的降低了程序的复杂度 3 缺点是:一套流水线或流程就是用来解决一个问题,不能被轻意的修改,修改一点可以会涉及到所有。 4 应用场景:linux内核,git,以及httpd等
1 #面向对象的程序设计是核心是对象(上帝思维),可以创造一个对象,让其来执行某件事。 2 #优点:解决了程序的扩展性。对某一个对象单独修改,会立刻反映到整个体系中,如对游戏中某一人物参数的特征和技能修改就很容易了。 3 #缺点:可控性差,无法向面向过程的程序设计流水线式的可以很精准的预测问题的处理流程与结果,面向对象的程序一旦开始就由对象之间的交互解决问题,即便是上帝也无法预测最终结果。
于是我们经常看到一个游戏人某一参数的修改极有可能导致阴霸的技能出现,一刀砍死3个人,这个游戏就失去平衡。 4 #应用场景:需求经常变化的软件,一般需求的变化都集中在用户层,互联网应用,企业内部软件,游戏等都是面向对象的程序设计大显身手的好地方
1 面向对象的程序设计只是用来解决扩展性的。
| 二、类和对象 |
1 什么是对象,什么是类 2 python中一切皆对象,且python3统一了类和类型的概念,类型就是类。如下类型即是类: 3 dict 字典类型,即是dict类 4 list 列表类型,即是list类 5 6 >>> dict #类型dict就是类dict 7 <class 'dict'> 8 >>> d=dict(name='jack') #实例化 9 >>> d.pop('name') #向d发一条消息,执行d的方法pop 10 'jack' 11 12 #类是一系列对象共有的特征(变量的定义)与技能(函数的定义)结合 1 #定义一个类:
2 class chinese: 3 country = "china" 4 def talk(self): #self就是一个位置参数 5 print("talking",self) 6 #类中属性的引用 7 # print(chinese.country) 8 chinese.talk("jack") 9 chinese.x=1 #在chinese类中添加了一个x的变量,值为1 10 #实例化类 类名加括号就是实例化,会自动触发__init__函数的运行,可以用它来为每个实例定制自己的特征。
实例化
11 p1=chinese() #将类的内存地址给p1 12 print(p1)
1 #对象的使用只有一种就是属性的引用 2 class chinese: 3 country = "china" 4 def __init__(self,name,age,sex): #相当于将p1传给self 5 self.Name=name 6 self.Age=age 7 self.Sex=sex 8 def talk(self): 9 print("%s talking" % self.Name) 10 p1=chinese("jack",20,"male") #就是在执行chinese.__init__(p1,"jack",20,"male"),然后执行__init__内的代码,p1.Name="jack" 11 print(p1.Name) # 12 print(p1.Age) 13 print(p1.Sex) 14 p1.talk()
| 三、类与对象的名称空间以及绑定方法 |
创建一个类就会创建一个类的名称空间,用来存储类中定义的所有名字,这些名字称为类的属性。
1 类有两种属性:数据属性和函数属性 2 而类中的属性是共享给所有对象的 3
print(id(p1.country)) print(id(Chinese.country) 40342616 40342616
类的函数属性是绑定到所有对象的:
>>> id(p1.talk) >>> id(Chinese.talk) ''' p1.talk就是在执行Chinese.talk的功能,python的class机制会将Chinese的函数属性talk绑定给p1,p1相当于拿到了一个指针,指向Chinese类的talk功能 除此之外p1.talk()会将p1传给talk的第一个参数 '''
1 #定义在类内部的变量,是所有对象共有的,id全一样 2 #定义在类内部的函数,是绑定到所有对象的,是给对象来用,obj.func()会把obj本身当做第一个参数出入 3 #绑定方法:绑定到谁身上,就是给谁用的,谁来调用就会把自己当做第一个参数传入
1 #class.__dict__ 查看类的属性字典,也可以称为名称空间 2
#示例 class Chinese: country = 'China' def __init__(self,name,age): # print('====>') self.name=name #p1.name='jack' self.age=age #p1.age=18 def talk(self): print('say chinese',self) #类的第一种用法:实例化 p1=Chinese('jack',18) #__init__(p1,'jack',18) print(Chinese.__dict__) #查看类的属性字典,或者说名称空间 print(Chinese.country) #等价于下面的内容 print(Chinese.__dict__['country']) #返回结果为: {'__module__': '__main__', 'country': 'China', '__init__': <function Chinese.__init__ at 0x000001AA3849B9D8>, 'talk': <function Chinese.talk at 0x000001AA3849BA60>, '__dict__': <attribute '__dict__' of 'Chinese' objects>, '__weakref__': <attribute '__weakref__' of 'Chinese' objects>, '__doc__': None} China China
1 #id为身份验证 2 示例: 3 class Chinese: 4 country = 'China' 5 def __init__(self,name,age): 6 # print('====>') 7 self.name=name #p1.name='egon' 8 self.age=age #p1.age=18 9 10 def talk(self): 11 print('say chinese',self) 12 13 p1=Chinese('egon',18) #__init__(p1,'egon',18) 14 p2=Chinese('alex',1000) #__init__(p1,'egon',18) 15 print(id(p1.country)) 16 print(id(p2.country)) 17 print(id(Chinese.country)) 18 19 #返回结果为: id结果一样,说明共用的是同个属性 20 139830990561208 21 139830990561208 22 139830990561208


浙公网安备 33010602011771号