面向过程vs面向对象
面向过程
优点:极大的降低了写程序的复杂度,只要顺着要执行的步骤,堆叠代码即可。
缺点:一套流水线或者流程就是用来解决一个问题,代码牵一发而动全身。
应用场景:一旦完成基本很少改变的场景,著名的例子有Linux内核,git,以及Apache HTTP Server等。
面向对象
优点:解决了程序的扩展性。对某一个对象单独修改,会立刻反映到整个体系中,如对游戏中一个人物参数的特征和技能修改都很容易。
缺点:可控性差,无法像面向过程的程序设计流水线式的可以很精准的预测问题的处理流程与结果,面向对象的程序一旦开始就由对象之间的交互解决问题,即便是上帝也无法预测最终结果。于是我们经常看到一个游戏某一人物参数的修改极有可能导致阴霾的技能出现,一刀砍死3个人,这个游戏就失去了平衡。
应用场景:需求经常变化的软件,一般需求的变化都集中在用户层,互联网应用,企业内部软件,游戏等都是面向对象的程序设计大仙射手的好地方。
1. 类
1.1 类的定义格式
class Person: #定义类名,命名规则:首字母大写
role = “中国人” # 属性 --- 静态属性
def __init__(self,参数):
self.参数名 = 参数
def walk(self): # 方法 --- 动态属性
print("person is walkiing…")
print(Person.role) # 查看人的role属性
print(Person.walk) # 引用走路的方法
我们查看类的属性的方法:
- dir(类名):查出一个名字列表
- 类名.dict: 查出的是一个字典,key为属性名,value为属性值
PS: 特殊的类的对象
类名.__name__ # 类的名字(字符串)
类名.__doc__ # 类的文档字符串
类名.__base__ # 类的第一个父类(继承)
类名.__bases__ #类所有父类构成的元祖(继承)
类名.__dict__ # 类的字典属性
类名.__module__ # 类定义所在的模块
类名.__class__ # 实例对应的类(仅新式类中)
1.2 实例化
实例化:类名加括号就是实例化,会自动触发__init__函数的运行,可以用它来为每个实例定制自己的特征
实例化的过程就是类——>对象的过程
语法:对象名 = 类名(参数)
bit = Person('bit') # 类名()就等于执行Person.__init__()
print(bit) #返回一个对象,这个对象类似字典,存放着属于这个类的一些属性和方法。
1.3 查看属性&调用方法
print(bit.name) #查看属性直接 对象名.属性名
print(bit.walk()) #调用方法 ,对象名.方法名()
2. 对象
对象是关于类而实际存在的一个例子,即实例
对象/实例只有一种作用:属性引用
bit = Person('bit')
print(bit.name)
也可以引用一个方法,因为方法也是一个属性,只不过是一个类似函数的属性,即动态属性
print(bit.walk)
3. 类命名空间与对象、实例的命名空间
创建一个类就会创建一个类的名称空间,用来存储类中定义的所有名字,这些名字称为类的属性
类的属性:
- 静态属性:就是直接在类中定义的变量
- 动态属性: 就是定义在类中的方法
类的所有属性是共享给所有对象的
类的动态属性是绑定到所有对象的
创建一个对象/实例就会创建一个相对的名称空间,存放属性
在obj.name会先从自己的命名空间找name,找不到则在类中找,类找不到找父类,最后找不到抛出异常
小结
# -*- coding:utf-8 -*-
__author__ = '8192bit'
class Person: # 类名首字母大写
role = '中国人' # 属性 静态属性
def __init__(self,name,life_value,agg,money):
self.name = name
self.life_value = life_value
self.agg = agg
self.money = money
def attack(self,object): # 方法 动态属性
object.life_value = object.life_value - self.agg
class Dog:
def __init__(self,name,beer,life_value,agg):
self.name = name
self.beer = beer
self.life_value = life_value
self.agg = agg
def bite(self,person):
person.life_value = person.life_value - self.agg
class Weapon:
def __init__(self,name,price,agg,life_vaule,attack_force):
self.name = name
self.price = price
self.agg = agg
self.life_vaule = life_vaule
self.attack_force = attack_force
def update(self,person):
person.money = person.money - self.price
person.agg = person.agg + self.agg
self.life_vaule -= 1
def kill(self,obj):
obj.life_value = obj.life_value - self.attack_force
self.life_vaule -= 2
egg = Person('egg',5000,50,1000)
alex = Person('alex',250,5,1000)
erha = Dog('luhu','erha',20000,100)
egg.role = '狗' # 可自行修改,修改后会在自己的命名空间内多出一个role属性
Person.role = 'everybody' # 修改全局所有的role参数
print(egg.life_value) # 攻击之前的life_value
alex.attack(egg) # alex攻击了egg
print(egg.life_value) # 攻击之后的life_value
print(egg.role) # 结果是狗,即使修改全局,也影响不到egg的命名空间内的role属性
print(alex.agg) # alex的攻击力
print(alex.life_value) # egg攻击前,alex的生命值
egg.attack(alex) # egg攻击alex
print(alex.life_value) # egg攻击后,erha攻击前,alex的生命值
erha.bite(alex) # erha攻击alex
print(alex.life_value) # egg攻击后,erha攻击后,alex的生命值
感谢
感谢eval美女倾囊相授
感谢为知笔记