一. 面向对象的引入
# 人狗大战
def person(name,HP,aggr,sex):
person = {
'name':name, # 昵称
'HP':HP, # 生命值
'aggr':aggr, # 攻击力
'sex':sex
}
return person
alex = person('狗剩儿',100,2,'不详')
nezha = person('哪吒',200,1,'不详')
# 代码精简了,方便增加人物,方便修改,人物更加规范      ------  人的模板
print(alex)
def dogs(name,HP,aggr,kind):
dog = {
'name':name,
'HP':HP,
'aggr':aggr,
'kind':kind
}
return dog
jin = dogs('金老板',1000,1,'泰迪') # 人:攻击技能(打)
def attack(person,dog):
dog['HP'] -= person['aggr']
print('%s被打了,掉了%s滴血'%(dog['name'],person['aggr']))
# 狗:攻击技能(咬人)
def bite(dog,person):
person['HP'] -= dog['aggr']
print('%s被咬了,掉了%s滴血'%(person['name'],dog['aggr']))
# dogs函数、person函数都是定义了一类事物
# 直到调用了函数,赋了值之后才真的有了实实在在的人或狗
bite(jin,alex)
print(alex)
bite(nezha,jin) # 变成了人咬狗了,乱了乱了,怎么办?
于是:
def person(name,HP,aggr,sex):
person = {
'name':name, # 昵称
'HP':HP, # 生命值
'aggr':aggr, # 攻击力
'sex':sex,
} # 人:攻击技能(打)
def attack(dog):
dog['HP'] -= person['aggr']
print('%s被打了,掉了%s滴血' % (dog['name'], person['aggr'])) person['attack'] = attack # 函数名 攻击技能 return person def dogs(name,HP,aggr,kind):
dog = {
'name':name,
'HP':HP,
'aggr':aggr,
'kind':kind
} # 狗:攻击技能(咬人)
def bite(person):
person['HP'] -= dog['aggr']
print('%s被咬了,掉了%s滴血' % (person['name'], dog['aggr'])) dog['bite'] = bite
return dog

alex = person('狗剩儿',100,2,'不详')
nezha = person('哪吒',200,1,'不详')
jin = dogs('金老板',1000,1,'泰迪') jin['bite'](alex)
alex['attack'](jin)
# 面向对象编程
# 所谓模板,就是 类 --- 抽象的,我能知道有什么属性,但不能知道属性具体的值
# jin alex nezha 就是对象 --- 有具体的值,属性都是根据 类 规范的 二. 初识面向对象
字典就是一类数据结构,我一说字典你就知道是那个用{}表示,里面由k-v键值对的东西,它还具有一些增删改查的方法。
但是我一说字典你能知道字典里具体存了哪些内容么?不能,所以我们说对于一个类来说,它具有相同的特征属性和方法。 print(list) # 类
[1,2] # 对象 自定义一个类 # 类名开头一般大写
定义函数时:
def 函数名():
pass

定义类
class 类名: # 可以加括号,可以不加
属性 = 'a'
print(类名.属性) # a
类名的作用,就是操作属性,查看属性
# 人狗大战
class Person:                     # 类名
country = 'China' # 创造了一个只要是这个类就一定有的属性,这个属性叫做 类属性 ,也叫 静态属性
def __init__(self,*args): # 初始化方法,self是对象,必须有
print(self.__dict__) # {} , self就是一个可以存储很多属性的大字典
self.name = args[0] # name 为属性 ,往字典里添加属性的方式发生了一些变化
self.HP = args[1] # HP 为属性
self.aggr = args[2] # aggr 为属性
self.sex = args[3] # sex 为属性
print(self.__dict__) # {'name': '狗剩儿', 'HP': 100, 'aggr': 2, 'sex': '不详'}
print(id(self)) # def walk(self,n): # 方法,一般情况下,必须传self参数,且必须写在第一个,后面还可以传其他参数
print('{} 走走走,走了{}步'.format(self.name,n)) alex = Person('狗剩儿',100,2,'不详') # 对象 # 实例化,,# 类名,可以实例化对象
# print(alex.__dict__) # {'name': '狗剩儿', 'HP': 100, 'aggr': 2, 'sex': '不详'},查看所有属性
# print(alex) # <__main__.Person object at 0x0000018EFBBD58D0>
# print(alex.name) # 狗剩儿
# print(alex.HP) # 100
# print(id(alex)) # 2085337454856 内存地址一样
print(Person.__dict__) # Person里面有walk
Person.walk(alex,5) # 调用方法 :类名.方法名(对象名)
# alex.walk() # 相当于 Person.walk(alex)
alex.walk(5) # 相当于 Person.walk(alex,5) print(Person.country) # 类名 ,可以查看类中的属性,不需要实例化就可以查看 print(Person.__dict__['country']) # China
print(alex.__dict__['name']) # 狗剩儿 # Person.__dict__['country'] = '印度' # 报错 对于类的字典,只能看,不能改
对于对象,可不可以修改?,可不可以删除?
  可以的,可以的
alex.__dict__['name'] = '二哥'
print(alex.__dict__) # {'name': '二哥', 'HP': 100, 'aggr': 2, 'sex': '不详'}
# 但一般不这么改。
# 应该这样改:
print(alex.name) # 二哥
alex.name = '大哥'
print(alex.name) # 大哥
print(alex.__dict__) # {'name': '大哥', 'HP': 100, 'aggr': 2, 'sex': '不详'}
alex.age = 88 # 增加一个属性
print(alex.__dict__) # {'name': '大哥', 'HP': 100, 'aggr': 2, 'sex': '不详', 'age': 88}
总结:
对象 = 类名()
过程:
类名() 首先会创造出一个对象,创建了一个self变量
调用__init__方法,类名括号里的参数会被这里接收
执行__init__方法
返回self
对象能做的事:
查看属性:print(alex.name)、print(alex.HP)
调用方法
__dict__ 对于对象的增删改查操作都可以通过字典的语法进行
类名能做的事:
实例化
调用方法,只不过要自己传递self参数
调用类中的属性,也就是调用静态属性
__dict__,对于类中的名字只能看,不能操作

python学习之老男孩python全栈第九期_day022知识点总结——初识面向对象的更多相关文章

  1. python学习之老男孩python全栈第九期_day017知识点总结——初识递归、算法

    一. 递归函数 如果一个函数在内部调用自身本身,这个函数就是递归函数. 最大递归深度默认是997 -- python从内存角度出发做得限制(而不是程序真的报错),最大深度可以修改 def func(n ...

  2. python学习之老男孩python全栈第九期_day027知识点总结——反射、类的内置方法

    一. 反射 ''' # isinstance class A:pass class B(A):pass a = A() print(isinstance(a,A)) # 判断对象和类的关系 print ...

  3. python学习之老男孩python全栈第九期_day025知识点总结——接口类、抽象类、多态、封装

    一. 接口类 java:面向对象编程 设计模式 -- 接口类 接口类:python原生不支持 抽象类:python 原生支持的 from abc import abstractclassmethod, ...

  4. python学习之老男孩python全栈第九期_day023知识点总结——类和对象命名空间、组合

    一. 类和对象命名空间类里 可以定义两种属性: 1. 静态属性 2. 动态属性 class Course: language = 'Chinese' def __init__(self, teache ...

  5. python学习之老男孩python全栈第九期_day019知识点总结——collections模块、时间模块、random模块、os模块、sys模块

    一. collections模块 在内置数据类型(dict.list.set.tuple)的基础上,collections模块还提供了几个额外的数据类型:namedtuple.deque.Counte ...

  6. python学习之老男孩python全栈第九期_day010知识点总结

    def qqxing(l = []): # 可变数据类型 l.append(1) print(l)qqxing() # [1]qqxing([]) # [1]qqxing() # [1, 1]qqxi ...

  7. python学习之老男孩python全栈第九期_day007知识点总结

    基础数据类型汇总 1. str 2. int 3. list 4. bool 5. dict (1) fromkeys Python 字典 fromkeys() 方法用于创建一个新的字典,并以可迭代对 ...

  8. python学习之老男孩python全栈第九期_day001知识点总结

    1. Python2与Python3的区别: Python2:源码不标准,混乱,重复代码太多: Python3:统一标准,去除重复代码. 编码方式: python2的默认编码方式为ASCII码:pyt ...

  9. python学习之老男孩python全栈第九期_day014知识点总结

    # 迭代器和生成器# 迭代器 # 双下方法:很少直接调用的方法,一般情况下,是通过其他语法触发的# 可迭代的 --> 可迭代协议:含有__iter__的方法( '__iter__' in dir ...

随机推荐

  1. 2016级算法期末模拟练习赛-F.AlvinZH的青春记忆IV

    1086 AlvinZH的青春记忆IV 思路 难题,动态规划. 这是一道很有意思的题,因为它不仅卡了时间,也卡了空间,而且卡的很妙很迷. 光是理解题意已经有点难度,简化题意:两串数字序列,相等的数字定 ...

  2. 高斯分布(Gaussian Distribution)的概率密度函数(probability density function)

    高斯分布(Gaussian Distribution)的概率密度函数(probability density function) 对应于numpy中: numpy.random.normal(loc= ...

  3. day5:python学习之集合

    0. 集合的作用及特点 集合具有去重和关系测试两大作用,它具有无序的特点. list1 = [1,2,3,4,5,7,6,8,6,4] list1 = set(list1) print(list1) ...

  4. (JAVA作业)练习:创建一个类名为Fruit;包含实例变量:水果名称,颜色,价格,上市月份,有无种子 10个实例:苹果,香蕉,芭乐,柚子,李子,杨桃,猕猴桃,哈密瓜,葡萄,榴莲; 实现功能:提示用户输入水果品种编号,输出该水果的全部信息。

    class Lei { String name; String color; int price; int date; int num; String zz; void assemble(){ Sys ...

  5. 【第2次会议记录_2018.5.27】—— [ 算法原理 ]:手工特征提取的概念问题。(by_wanghao)

    1.提取 特征点 .特征描述子 与 提取特征向量 之间的区别: (1).特征点:指的是一张图片上比较有代表性的‘位置’,提取特征点就是把图片中这些有代表性的位置给标出来. (2).特征描述子:当提取出 ...

  6. python爬虫常用之Scrapy 中间件

    一.概述 1.中间件的作用 在scrapy运行的整个过程中,对scrapy框架运行的某些步骤做一些适配自己项目的动作. 例如scrapy内置的HttpErrorMiddleware,可以在http请求 ...

  7. Mac下常用快捷键(转)

    前提,先熟读键盘快捷键符号:http://www.cnblogs.com/EasonJim/p/6350075.html 基本操作: Command-Z 撤销 Command-X 剪切 Command ...

  8. Yii 使用Widge面面观

    我们可以把Widget视为一个嵌入到控制器管理 的视图中的微控制器,其实就是.net框架中的用户控件,或者类似于.net MVC中的子视图.与controller相比较,微件没有既没有动作,也没有过滤 ...

  9. centos 7编译安装Python3.6.1

    1.准备必要的库文件 yum install -y gcc zlib-devel openssl-devel sqlite-devel 2.进入源代码包 ./configure prefix=/usr ...

  10. accessToken的使用

    1.accessToken是啥,干嘛用? 形象解释:申请调兵-->皇帝同意-->兵符-->开始调兵 拿到用户在第三方平台的唯一的标识; 获取用户的nickname,头像,邮箱等其他信 ...