day23 面向对象 函数和方法区分
最近两周内容大概回顾:
# 文件操作 # # 模块:random,序列化模块,时间模块,collections,re,os,sys # 模块与包的概念和导入方法 # 写代码的规范 # 正则表达式 # 异常处理 # # 函数: # 函数的命名空间和作用域 # 内置函数 # 闭包 : 装饰器函数 # 生成器函数:生成器表达式,各种推导式,迭代器 # 匿名函数 # 递归函数 : 二分查找算法 #作业1 # 基础数据类型 # 文件操作 # 函数 # 模块 # 面向对象 # 网络编程(空) # 线程进程协程、IO多路复用(空) # 其他 # 序列化模块——shelve # import shelve # f = shelve.open('ff') # f['key'] = {'k1':'v1'} # f.close() # f = shelve.open('ff',flag='r') # 只读 # f['key'] = [1,2,3] # f.close() # f = shelve.open('ff') # print(f['key']) # f.close()
今天内容概要:
# 认识面向对象
# 了解面向对象编程
# 基础的 类 对象的语法
初识面向对象:
#生命值 100 #攻击力 10 #名字 XXX #职业 XXX def Person(life_value,aggr,name,job): def attack(dog): print('%s 攻击了 %s' % (person['name'], dog['name'])) dog['life_value'] = dog['life_value'] - person['aggr'] person = { #模子 'life_value':life_value,#生命值 'aggr':aggr, #aggressive攻击力 'name':name, 'job' : job, 'attack' : attack } return person boss_gold = Person(1000,2,'金老板','boss') alex = Person(250,250,'alex','big_boss') # print(boss_gold['life_value']) def Dog(name,life_value,aggr,kind): def bite(person): print('%s 咬了 %s' % (dog['name'], person['name'])) person['life_value'] -= dog['aggr'] dog ={ 'name':name, 'life_value':life_value, 'aggr' : aggr, 'kind' : kind, 'bite' : bite } return dog alph = Dog('alphgou',10000,999,'AI') flower = Dog('小花',150,300,'2ha') alph['bite'](boss_gold) alex['attack'](flower) #这就是面向对象编程 #面向对象编程 是一种思想 #对象就是具体的拥有准确属性值的一些变量 #类:一类具有相同属性和方法的事物 #字典 _ 类 d1 = {'k1':'v1'} #对象 #动物园:老虎 狮子 猴 # attack(boss_gold,flower) # print(flower['life_value']) # bite(alph,alex) # print(alex['life_value'])
面向对象:
def 函数名(): '''函数体''' pass # class Person: #类名有两个作用 # country = '中国' #静态属性、数据属性 # def walk(self): #动态属性、函数属性、方法 # print('walk') #1.属性引用 # print(Person.country) #静态属性的查看 # print(Person.walk) # Person.role = '人' #添加一个新静态属性 # Person.country = '印度' #修改一个新静态属性 # del Person.role #删除一个静态属性 # print(Person.__dict__) # print(Person.walk()) #报错 少self参数 # Person.__dict__['country'] = '印度' #报错 不能改变 # print(Person.__dict__['country']) # print(Person.country) #类能完成的第二个功能:实例化对象 #实例化:从一个类中创造一个具体的对象的过程 # p = Person() # print(p) #Person的对象 # class Person: #类名有两个作用 # country = '中国' #静态属性、数据属性 # def __init__(self,life_value,aggr,name,job): #初始化方法 # #self = {'lv':life_value} # self.lv = life_value #属性,对象属性 # self.aggr = aggr # self.name = name # self.job = job # def walk(self): #动态属性、函数属性、方法 # print('%s is walking'%self.name) # # # p = Person() #如何让对象拥有具体的属性 # p = Person(1000,2,'金老板','boss') #如何让对象拥有具体的属性 # p.walk() # Person.walk(p) # print(p.lv) #Person的对象 # print(p.aggr) #Person的对象 # print(p.name) #Person的对象 # print(p.job) #Person的对象 # p.sex = 'lady_boy' #添加一个属性 # print(p.sex) # p.sex = 'girl' #属性的修改 # print(p.sex) #属性的删除 # del p.sex # print(p.__dict__) # print(p.__dict__['lv']) #查看 # p.__dict__['lv'] = 998 #对象名.__dict__中的属性值可以被修改 # print(p.__dict__['lv'],p.lv) # p.__dict__['sex'] = 'lady_boy' #对象名.__dict__中的属性值可以增加 # print(p.__dict__,p.sex) # p.__dict__.pop('sex') #对象名.__dict__中的属性值可以被删除 # print(p.__dict__) #类 # 类的定义 class关键字 类名的首字母大写 # 类中直接定义属性:静态属性(变量) 和 动态属性(函数) # 类名的两个作用:属性的引用,实例化对象 # 类名和属性的操作:对象名.属性名 对象名.__dict__['属性名'](不能修改) #实例化 ——类名(参数) #构造方法:造对象 #初始化__init__:给这个赤裸裸的对象添加一些属性 __init__ #返回了一个初始化之后的对象 #__init__方法:初始化方法,可以没有。给对象添加一些必要的基础属性 #self的含义:就是这个对象本身 #对象和属性的操作:对象名.属性名 对象名.__dict__['属性名'] class Person: #类名有两个作用 country = '中国' #静态属性、数据属性 def __init__(self,life_value,aggr,name,job): #初始化方法 #self = {'lv':life_value} self.lv = life_value #属性,对象属性 self.aggr = aggr self.name = name self.job = job def walk(self): #动态属性、函数属性、方法 print('%s is walking'%self.name) boss_gold = Person(10,1,'太白太黑太亮','old_driver') alex = Person(100,2.5,'张嘴闭嘴tesla','鸡汤哥') # boss_gold.walk() # alex.walk() boss_gold.sex = 'None' print(alex.__dict__)
面向对象交互:
#人类 : # 属性 :life_value,aggr,name,job # 方法: attack class Person: def __init__(self,life_value,aggr,name,job): self.life = life_value self.aggressive = aggr self.name = name self.job = job def attack(self,dog_obj): #boss_gold,tiedan print('%s 攻击了 %s'%(self.name,dog_obj.name)) dog_obj.life = dog_obj.life - self.aggressive #狗类: # 属性:life_value,aggr,name,kind # 方法:bite class Dog: def __init__(self,life_value,aggr,name,kind): self.life = life_value self.aggressive = aggr self.name = name self.kind = kind def bite(self,person_obj): print('%s 咬了 %s' % (self.name, person_obj.name)) person_obj.life -= self.aggressive tiedan = Dog(1000,100,'铁蛋','土狗') boss_gold = Person(100,2.5,'太黑','old_driver') # boss_gold.attack(tiedan) #Person.attack(boss_gold,tiedan) # print(tiedan.life) # tiedan.bite(boss_gold) # print(boss_gold.life) #三个攻击技能 #面向对象的交互 # 作业零:画图 # 基础数据类型 # 文件操作 # 函数 # 模块 # 面向对象 # 网络编程(空) # 线程进程协程、IO多路复用(空) # 其他 # 练习一:在终端输出如下信息 # # 小明,10岁,男,上山去砍柴 # 小明,10岁,男,开车去东北 # 小明,10岁,男,最爱大保健 # 老李,90岁,男,上山去砍柴 # 老李,90岁,男,开车去东北 # 老李,90岁,男,最爱大保健 # 老张… # 练习二: #创造一个圆形类,属性:半径,两个方法:求周长,求面积 # 练习三: #继续写人狗大战游戏 # 预习:http://www.cnblogs.com/Eva-J/articles/7293890.html # 周末:神经网络公开课
==============================================================================================================================================================================================================================================================================
判断一个函数是方法还是一个类
from types import MethodType(方法),FunctionType(函数) def func(): pass print(isinstance(func,FunctionType)) # True class A(): def aaa(self): pass print(isinstance(aaa,FunctionType)) # True a=A() print(isinstance(a.aaa,MethodType)) # True要有实例化出来的对象才可以,如果只是用类名去调用的话还是function,只有用实例化出来的对象去调用才可以得到method 我们的函数只有跟我们的实例化出来的对象有绑定关系才能称之为方法,否则都是函数,即便它是写到类里面的方法,没有跟我们的类实例化出来的对象进行绑定,它依然是函数,而不是类里面的方法.