python学习 day18 (3月25日)---( 面向对象浅析)
面向对象思想:
字典表示对象:
不是太好 因为 变量 得一个个的赋值改值
{'name':'alex','blood':20,'attack':1,'sex':'不'}
{'name':'太亮','blood':20,'sex':'不'}
{'name':'alex','blood':20,'attack':1,'sex':'不'}
函数表示面向对象:
对象赋值
#通过两个模子,捏出两个具体的角色
#抽象 : 只能知道有那些属性
#具体 : 可以描述他的属性的值的
def Person(name,hp,ad,sex):
dic = {'name':name,'blood':hp,'attack':ad,'sex':sex}
return dic
alex = Person('liuer',1,1,'Man') def Dog(name,hp,ad,sex):
dic = {'name':name,'blood':hp,'attack':ad,'sex':sex}
return dic
ret = Dog('小黑',3000,10,'哈士奇')
print(ret)
对象之间发生关系
人打狗 狗咬人
#互相打
def fight(dog,person):
#狗掉血,就是人的攻击力
dog['blood']-= person['attack']
print('%s打了%s,%s掉了%s'%(person['name'],dog['name'],dog['name'],person['attack']))
def bite(dog,person):
person['blood'] -= dog['attack']
print('%s咬了%s,%s掉了%s'%(person['name'],dog['name'],dog['name'],person['attack']))
hei = Dog('小黑',3000,10,'哈士奇')
# fight(hei['blood'],person_ad=alex['attack'])
fight(hei,alex)
print(hei)
bite(hei,alex)
print(alex)
不好的是,bite(a,b) ab两个元素,关系不明确 是 a bite b 还是 b bite a
改进 对象
程序里dic['fight'] = fight 把函数 塞进了字典 可以通过
alex = Person('alex',20,1,'不详') alex['fight'](hei) 调用 实现函数的嵌套
但是为什么 return dic 返回 None 呢
# 给两个特定的属于特定角色的方法 设置了他的使用范围
# 让其他角色不能随意调用属于固定角色的方法
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 dic
def 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
# 互相打
alex = Person('alex',20,1,'不详')
hei = Dog('小黑',3000,10,'哈士奇')
alex['fight'](hei)
hei['bite'](alex)
总结:
# 先思考这个程序中有几个角色
# 然后描述这个角色 属性和动作
# 把这个属性和动作都装到一个角色中
# 面向对象编程
面向对象语法:
# 对象 : 具有具体的属性值的 实际存在的例子
#实例
# 类:具有相同方法和属性的一类事物
类总是大写字母开头
两种方法调用类的元素
class 类名:
pass
#空类
class Dog: # 总是大写开头的
变量1 = 100
变量2 = 'abc'
变量3 = [(1,2),(3,4)]
print(Dog.__dict__) #{'__module__': '__main__', '变量1': 100, '变量2': 'abc', '变量3': [(1, 2), (3, 4)], '__dict__': <attribute '__dict__' of 'Dog' objects>, '__weakref__': <attribute '__weakref__' of 'Dog' objects>, '__doc__': None}
print(Dog.__dict__['变量1']) #
# 第二种方法常用
print(Dog.变量1) #
print(Dog) #<class '__main__.Dog'>
# 每一只狗 都需要自己的属性
新建一个完整的类
class Dog: # 狗模子 --类
def __init__(self,name,hp,ad,sex): #固定的 函数有默认参数
print('执行了') #self就可以当字典使用
print(name,hp,ad,sex)
self.name = name
self.blood = hp
self.ad = ad
self.sex = ad
# self.__dict__['name'] = name
# self.__dict__['blood'] = hp
# self.__dict__['ad'] =ad
# self.__dict__['sex'] = sex
print(self.__dict__)#{'name': 'alex', 'blood': 20, 'ad': 10, 'sex': '不祥'}
# 不用 return self 自己就传出来
# 具体的狗 对象 #自动的调用了Dog(对象) init
alex = Dog('alex',20,10,'不祥')# 默认有一个参数 传了了五个
#_init__() takes 1 positional argument but 5 were given
print(alex.__dict__)#{'name': 'alex', 'blood': 20, 'ad': 10, 'sex': '不祥'}
print(alex.name)
print(alex.blood)
实例化
# 狗模子 狗对象 都是一个内存空间 字典
# self 实际上 就是由 python 语法 开辟了 一个属于具体的对象的空间
# 执行 init 想self 自动添加 key等属性
#返回self
# 对象 也是实例
#创建了一个对象 也是创建实例
# 实例化的过程:
#1,开辟了一块块空间,创造了一个self变量来指向这块空间
#2,调用init ,自动传self 参数,其他的参数都是按照顺序传进来的
#3,执行init
#4, 将self 自动返回调用者
用的方法 而不是用函数的方法写 面向对象
class Dog: # 狗模子 --类
a = 1000 #静态变量 这个类中的变量 是所有
def __init__(self,name,hp,ad,sex): #固定的 函数有默认参数
#self就可以当字典使用
print(name,hp,ad,sex) #实例变量 对象属性
self.name = name
self.blood = hp
self.ad = ad
self.type = sex
def bite(self,person): #定义在类的内部的 动态变量 方法
person.blood -= self.ad
# print(self)
# print(dog)
print('%s 咬了 %s,%s 掉了 %s血'%(self.name,person.name,person.name,self.ad))
dog1 = Dog('tai',200,20,'贵妇') # 对象 实例
# print(do.name)
# print(do.type) #引用实例变量 tai 引用对象的属性
# print(Dog.a) # 所有的静态变量的值都尽量用类名去操作
# print(alex.a)
class Person: # 人模子 --类
a = 1000 #静态变量 这个类中的变量 是所有
def __init__(self,name,hp,ad,sex): #固定的 函数有默认参数
print('执行了') #self就可以当字典使用
print(name,hp,ad,sex) #实例变量 对象属性
self.name = name
self.blood = hp
self.ad = ad
self.type = sex # 对象的资源
def fight(self,dog): #定义在类的内部的 动态变量 方法
dog.blood -= self.ad
print('%s 打了 %s , %s 掉了 %s血'%(self.name,dog.name,dog.name,self.ad)) # print('do 是',do) #do 是 <__main__.Dog object at 0x000000000289DDD8>
taibai = Person('taibai',20,20,'male')
print(taibai.fight(dog1))
taibai.fight(dog1)
dog1.bite(taibai)
两种调用方法 :
函数:ren['fight'](dog) 用fight 引用函数 () 调用 dog是参数
类:ren.fight(dog) fight 是类的方法 dog 是另一个类的对象
python学习 day18 (3月25日)---( 面向对象浅析)的更多相关文章
- Python 学习日志9月19日
9月19日 周二 今天是普通的一天,昨天也是普通的一天,刚才我差点忘记写日志,突然想起来有个事情没做,回来写. 今天早晨学习<Head First HTML and CSS>第十一章节“布 ...
- Python 学习日志9月20日
9月20日 周三 多大年龄了,还活得像个小孩.——急什么,人生又不长. 你习惯了思考宇宙星辰,一百年真的不长,一生也就不那么长,许多人的价值观念你也就无法理解.同样,许多人也无法理解你的价值观念,感兴 ...
- Python学习日志9月17日 一周总结
周一,9月11日 这天写的是过去一周的周总结,我从中找出当天的内容. 这天早晨给电脑折腾装机,早晨基本上没有学习,休息了一个早晨. 下午写的上周总结,完事做mooc爬虫课的作业,<Think P ...
- Python 学习日志9月21日
9月21日 周四 今天是个特殊的日子吗,总感觉9月21这个日子听着怪怪的. 今天早晨看<Head First HTML and CSS>第13章节“表格和更多列表”,内容不多,看完并做了详 ...
- Python学习日志9月13日
昨天的学习日志没有写,乱忙了一整天,政治电脑. 好奇心重,想要给电脑装上传说中LInux操作系统,各种小问题折腾到半夜,今天又折腾到晚上才真正的装上系统. 可是装上系统后又发现各种的不好用.虽然界面比 ...
- python学习 day19 (3月26日)----(对象组合)
深谙:非常透彻地了解:熟悉内中情形.谙,读作‘ān’ 熟悉. 1.面向对象作用:规划了代码中的函数处理的是哪一类问题 解决了传参的问题 方便扩展 方便重用 2.类的定义和使用类当中有哪些成员 ''' ...
- Python学习日志9月16日
刚才我差点睡着了,差资料的时候太费神,有些累. 今天早晨学习了<head first HTML and CSS>,今天把昨天没看了的关于字体和颜色的一章节看完了,真长.我详细的做了笔记,并 ...
- python学习 day21 (3月28日)----(抽象类 多态 nametuple dump)
不要因为走的路太久了,而忘记了为了什么而出发. 提前作准备了吗?把思维导图的东西做了吗? 和工作了几年的人,相比,是不是相同的水平,如果要写简历的话. 一边学习,一边复习. 小就是大,少就是多. 1. ...
- Python学习日志9月15日
一周就要过去了,而我跟一周以前没什么区别.回想一下,我这周做了什么事情呢.恍然若失.这周的精力都浪费在很多不必要的事情上了.学过一片古文,讲后羿学射箭,他有一个同学跟他一样聪明,在一起学习.后羿呢,专 ...
随机推荐
- 1、str.join() 2、fromkeys() 3、深浅拷贝 4、set()
1. 补充基础数据类型的相关知识点 1. str. join() 把列表变成字符串 2. 列表不能再循环的时候删除. 因为索引会跟着改变 3. 字典也不能直接循环删除. 把要删除的内容记录在列表中. ...
- Angular之特性模块 ( Feature Module )
项目结构 一 创建特性模块,及其包含的组件.服务. ng g module art ng g component art/music ng g component art/dance ng g ser ...
- Centos7安装Wkhtmltopdf -- nodejs将html转pdf
安装wkhtmltopdf wget https://github.com/wkhtmltopdf/wkhtmltopdf/releases/download/0.12.4/wkhtmltox-0.1 ...
- python——线程相关
使用python的threading中的Thread 下面是两种基本的实现线程的方式: 第一种方式———— #coding=utf-8 """ thread的第一种声明及 ...
- 宋体freetype16和12号字无法正常显示
在使用freetype过程中发现,从window下拷贝来的simsun.ttc, simkai.ttf两个字体, 在调用 FT_Set_Pixel_Sizes(face, 12, 0): 将字体大小设 ...
- ARM交叉编译工具链
交叉编译工具链是一个由编译器.连接器和解释器组成的综合开发环境,交叉编译工具链主要由binutils.gcc和glibc三个部分组成. 免费版目前有三大主流工具商提供,第一是GNU(提供源码,自行编译 ...
- 浅谈前端三大框架Angular、react、vue
每个框架都不可避免会有自己的一些特点,从而会对使用者有一定的要求,这些要求就是主张,主张有强有弱,它的强势程度会影响在业务开发中的使用方式. 一.Angular,它两个版本都是强主张的,如果你用它,必 ...
- 如何查看Chrome浏览器保存的账号密码
之前告诉大家如何一键查看所有保存在IE里的所有密码(点击查看原文),现在来告诉大家如何一键查看Chrome浏览器的所有密码.某种意义上上,查看Chrome的密码比查看IE的更简单,因为查看IE密码还需 ...
- bootstrap之双日历时间段选择控件—daterangepicker(汉化版)
jQuerybootstrapdaterangepicker汉化版 双日历时间段选择插件 — daterangepicker是bootstrap框架后期的一个时间控件,可以设定多个时间段选项,也可以自 ...
- ios简单国际化
1.在PROJECT中Info得Localizations中添加语言 2.新建Localizable.strings(一定是这个文件名),在右侧属性栏的Localization中勾选出你需要的语言 3 ...