一:面向对象
def Person(name,hp,ad,sex): # 模子 dic = {'name':name,'blood':hp,'attack':ad,'sex':sex} def fight(dog): # 攻击 属于人 dog['blood'] -= dic['attack'] # 狗掉血,就是人的攻击力 print('%s打了%s,%s掉了%s血' % (dic['name'], dog['name'], dog['name'], dic['attack'])) dic['fight'] = fight return dicdef Dog(name,hp,ad,kind): dic = {'name': name, 'blood': hp, 'attack': ad, 'kind': kind} def bite(person): # 咬 属于狗 person['blood'] -= dic['attack'] print('%s咬了%s,%s掉了%s血' % (dic['name'], person['name'], person['name'], dic['attack'])) dic['bite'] = bite return dic# 互相打ivan = Person(' ivan ',20,1,'不详')print(alex)hei = Dog('小黑',3000,10,'哈士奇')print(hei)ivan ['fight'](hei)hei['bite']( ivan) 狗咬人,def bite(person):不用传dog,(不需要传其它的)
通过两个模子 捏出两个具体的角色抽象 :只能知道有哪些属性具体 :可以描述他的属性的值的给两个特定的属于特定角色的方法 设置了他的使用范围让其他角色不能随意调用属于固定角色的方法1 先思考这个程序中有几个角色2 然后描述这个角色 属性和动作3 把这个属性和动作都装到一个角色中4 面向对象编程
二:面向对象语法
对象 :具有具体的属性值的实际存在的例子 实例类 :具有相同方法和属性的一类事物class Dog: 变量 = 1000 变量2 = 'abc' 变量3 = [(1,2),(3,4)]查看类当中的变量,方法一print(Dog.__dict__['变量']) # Dog.__dict__ 生成一个字典print(Dog.__dict__['变量2'])print(Dog.__dict__['变量3'])查看方法二(常用)print(Dog.变量)print(Dog.变量2)print(Dog.变量3)每一只狗都需要有自己的属性class Dog: # 狗模子 -- 类 a = 1000 # 静态变量 这个类中的变量 是所有的对象共享的值 def __init__(self,name,hp,ad,sex): # init自动传进去,自动把self return回来 print('执行我啦') self.__dict__['name'] = name self.__dict__['blood'] = hp self.__dict__['ad'] = ad self.__dict__['sex'] = sex print(self.__dict__) # 上面所有的都进入到了这个字典ivan = Dog(' ivan ',20,10,'不详') # 具体的狗 对象 实例化的过程ivan = Dog(' ivan ',20,10,'不详')print(ivan.__dict__['name'])print(ivan.__dict__['blood'])# 对象 也是实例# 创建一个对象也是创建实例# 狗对象都是一个内存空间(字典)# self实际上是由python的语法 开辟了一个属于具体的对象的空间# 执行init,向self这块空间管理的字典中添加一些key value ,self会自动的被返回# 实例化的过程 : 1.开辟了一块空间,创造了一个self变量来指向这块空间 2.调用init,自动传self参数,其他的参数都是按照顺序传进来的 3.执行init 4.将self自动返回给调用者# ivan 就等于 self ,self返回的字典给Ivan,可以直接使用ivan内部的字典属性,直接加.就可以
class Dog: def __init__(self,name,hp,ad,kind): # 初始化方法 self.name = name # 实例变量 对象属性 self.blood = hp self.ad = ad # 左边ad相当于键,右边ad相当于值,使用时候是写左边的键 self.type = kindclass Person: a = 1000 # 静态变量 用类名调用 def __init__(self,name,hp,ad,sex): # 初始化方法 self.name = name # 实例变量 对象属性 self.blood = hp self.ad = ad self.sex = sex def fight(self,dog): # 动态变量 类方法 dog.blood -= self.ad # 狗掉血,就是人的攻击力 print('%s攻击了%s,%s掉了%s点血'%(self.name,dog.name,dog.name,self.ad))ivan = Dog(' ivan ',20,10,'不详') # ivan 对象 实例大亮 = Person('大亮',300,20,'male') # 大亮 对象 实例print( ivan.blood)大亮.fight(ivan) # 相当于 Person.fight(大亮, ivan)print(ivan.blood)1.类名可以调用所有定义在类中的名字 变量 : a 函数名 : def fight (init初始化方法是自动调用) 2.对象名 可以调用所有定义在对象中的属性在init函数中 和 self相关的# 调用函数的,且调用函数的时候,会把当前的对象当做第一个参数传递给self
三:清晰的面向对象例子
class Dog: def __init__(self,name,blood,ad,kind): self.name = name # 向对象的内存空间中添加属性 self.hp = blood # 可以通过self在类的内部完成 self.ad = ad self.kind = kind def bite(self,person): person.hp -= self.ad print('%s攻击了%s,%s掉了%s点血' % (self.name, person.name, person.name, self.ad))class Person: def __init__(self,name,hp,ad,sex): self.name = name self.hp = hp self.ad = ad self.sex = sex def fight(self,dog): dog.hp -= self.ad print('%s攻击了%s,%s掉了%s点血'%(self.name,dog.name,dog.name,self.ad)) hei = Dog('小黑',300,20,'哈士奇')ivan = Person(' ivan ',20,1,'不详')ivan.fight(hei)print(hei.hp)hei.bite(ivan)print(ivan.hp)
class Dog: def __init__(self,name,blood,ad,kind): self.name = name # 向对象的内存空间中添加属性 self.hp = blood # 可以通过self在类的内部完成 self.ad = ad self.kind = kindhei = Dog('小黑',300,20,'哈士奇')hua = Dog('小花',400,30,'萨摩耶')print(hei.name) # 小黑print(hei.ad) # 20print(hei.kind) # 哈士奇hei.food = '单身狗粮' # 也可以通过对象名在类的外部完成修改hei.hp = 305 # 也可以在类的外部通过对象名来修改属性的值print(hei.__dict__) # {'name': '小黑', 'hp': 305, 'ad': 20, 'kind': '哈士奇', 'food': '单身狗粮'}print(hei.hp) # 305print(hei. __dict__[‘hp’]) # 305del hei.hp # 删除属性print(hei.__dict__) # {'name': '小黑', 'ad': 20, 'kind': '哈士奇', 'food': '单身狗粮'}# self 就是 谁实例它,就是谁
# 圆形类# 属性 :半径# 方法 :计算周长(2pir) 计算面积(pir^2)from math import piprint(pi)class Circle: def __init__(self,r): self.r = r def area(self): return pi * self.r**2 def perimeter(self): return 2*self.r*pi c1 = Circle(5)c2 = Circle(15)print(c1.area())print(c1.perimeter())print(c2.area())print(c2.perimeter())
一切皆对象 ,所有的变量都是对象,是什么数据类型就是哪个对象list 类[1,2,3] 对象int 数据类型a = 1dict{'k':'v'}# 数据类型 也是类# 对象 就是具体的数字所以有的列表都能够使用列表的方法所以有的数字都能够使用列表的方法
四:练习
# 长方形 Rectangle # 正方形 Square # 圆形 circular# 平行四边形 Parallelogram # 三角形 Triangle# 边长 Side length # 高 high# 长方形class Rectangle: def __init__(self,long,wide): self.long=long self.wide=wide def area(self): return self.long*self.wide def perimeter(self): return self.long*2+self.wide*2r1=Rectangle(2,3)print(r1.area()) # 6print(r1.perimeter()) # 10
# 正方形class Square: def __init__(self,long): self.long=long def area(self): return self.long*self.long def perimeter(self): return self.long*4r1=Square(2)print(r1.area()) # 4 print(r1.perimeter()) #8# 平行四边形 底bottom 高high 斜边 hypotenuse# 周长=2(底边+斜边) # 面积=底*高class Parallelogram: def __init__(self,bottom,high,hypotenuse): self.bottom=bottom self.high=high self.hypotenuse=hypotenuse def area(self): return self.bottom*self.high def perimeter(self): return (self.bottom+self.hypotenuse)*2r1=Parallelogram(2,3,4)print(r1.area()) # 6 print(r1.perimeter()) #12# 三角形 底bottom 高high 斜边 long# 周长=long *3 # 面积=底*高/2class Triangle: def __init__(self,bottom,high,long): self.bottom=bottom self.high=high self.long=long def area(self): return self.bottom*self.high/2 def perimeter(self): return self.long*3r1=Triangle(2,3,4)print(r1.area()) # 3.0print(r1.perimeter()) # 12
# 圆形from math import piprint(pi) # 3.141592653589793class Circle: def __init__(self,r): self.r = r def area(self): return pi * self.r**2 def perimeter(self): return 2*self.r*pic1 = Circle(5)c2 = Circle(15)print(c1.area()) # 78.53981633974483print(c1.perimeter()) # 31.41592653589793print(c2.area()) # 706.8583470577034print(c2.perimeter()) # 94.24777960769379
五:总结
几十个函数去查看和圆形相关的方法是需要一定时间找到对应方法的不管求圆形周长还是面积,都需要传参数r所有的函数都是求周长和面积,导致给函数起名字的时候总是要带着图形面向对象的优点规划了代码中的函数处理的是哪一类问题解决了传参数的问题方便扩展方便重用
类 :有相同特征的事物归为一类对象、实例 :类的具体化实例化 :通过类创造一个对象的过程 对象 = 类名(参数,参数) 1.开辟一块内存空间,让self指向它 2.调用__init__方法,执行init 3.把self返回给调用者 类当中有哪些成员: 静态变量 ;动态变量,对象方法对象可以存哪些方法: 所有的对象属性都在对象里类名能做什么: 查看静态变量;实例化对象对象名能做什么: 属性的增删改查;方法的调用定义类class 类名: 静态变量 = 1000 def __init__(self,arg1,arg2): if arg1<=arg2: self.arg1 = arg1 self.arg2 = arg2 else: self.arg1 = arg2 self.arg2 = arg1 def 其他方法(self): print('其他方法往往是类名对应的对象所做的动作、行为') print('往往还会用到self内部的一些变量')对象1 = 类名(1,2)对象2 = 类名(3,4)