python:面向对象初级
面向对象编程
类的概念 : 具有相同属性和技能的一类事物
人类 抽象
对象 : 就是对一个类的具体的描述
具体的人 具体 使用面向对象的好处:
使得代码之间的角色关系更加明确
增强了代码的可扩展性
规范了对象的属性和技能
面向对象的特点:结局的不确定性
self = {'name': name, 'sex':sex, 'hp': hp, 'ad': ad}
def attack(dog): # 闭包
# 人攻击狗
print('%s攻击%s' % (self['name'], dog['name']))
# 狗掉血,狗的血量-人的攻击力
dog['hp'] -= self['ad']
self['attack'] = attack
return self def Dog(name,kind,hp,ad):
# 狗模子
self = {'name': name, 'kind':kind, 'hp': hp, 'ad': ad}
def bite(person):
print('%s咬了%s' % (self['name'], person['name']))
# 人掉血,人的血量-狗的攻击力
person['hp'] -= self['ad']
if person['hp'] <= 0: print('game over,%s win' % self['name'])
def bite2():pass
self['bite'] = bite
self['bite2
创建一个类
class Person:
role = 'person' # 静态属性
def f1(self): # 动态属性 方法(函数) 默认带一个参数self
查看静态变量的第一种方式
print(Person.__dict__) # 内置的双下方法
print(Person.__dict__['role'])
Person.__dict__['role'] = 456 # 报错
print(Person.__dict__['role'])
查看静态变量的第二种方式
print(Person.静态变量) # 123 值
print(Person.role)
Person.静态变量 = 456
Person.role = 456
print(Person.静态变量)#456 del Person.静态变量
print(Person.__dict__)
类名
引用静态变量
1.类名.__dict__['静态变量名'] 可以查看,但是不能删改
2.类名.静态变量名 直接就可以访问,可以删改
删除一个静态变量 del 类名.静态变量名
引用动态变量
1.类名.方法名 查看这个方法的内存地址
1.类名.方法名(实参) 调用了这个方法,必须传一个实参,这个实参传给了self
创造一个对象 - 实例化
产生一个实例(对象)的过程
对象 = 类名()
alex = Person() # 创造一个对象
alex 是对象、实例
Person是类
对象 = 类名()
class Person:
role = 'person' # 静态属性
def __init__(self,name,sex,hp,ad):
self.name = name # 对象属性 属性
self.sex = sex
self.hp = hp
self.ad = ad
def attack(self):
print('%s发起了一次攻击'%self.name) alex = Person('a_sb','不详',1,5)
boss_jin = Person('金老板','女',20,50) alex.attack() # Person.attack(alex)
boss_jin.attack() # Person.attack(boss_jin)
实例化 :创造一个对象的过程:实例化
实例化的过程:
1.创造一个实例,将会作为一个实际参数 # python
2.自动触发一个__init__的方法,并且把实例以参数的形式传递给__init__方法中的self形参
3.执行完__init__方法之后,会将self自动返回给alex
__init__方法 :初始化方法,给一个对象添加一些基础属性的方法,一般情况下是针对self的赋值
对象
在类的内部 self是本类的一个对象
在类的外部,每一个对象都对应着一个名字,这个对象指向一个对象的内存空间
属性的调用:
对象名.属性名 第一种调用方法
对象名.__dict__['属性名'] 第二种调用方法
方法的调用 :
类名.方法名(对象名) # 那么方法中的self参数就指向这个对象
对象名.方法名() # 这样写 相当于 方法中的self参数直接指向这个对象
面向对象:交互
class Person:
role = 'person' # 静态属性
def __init__(self,name,sex,hp,ad):
self.name = name # 对象属性 属性
self.sex = sex
self.hp = hp #血量
self.ad = ad #攻击力
def attack(self,d):
d.hp -= self.ad
print('%s攻击了%s,%s掉了%s点血'%(self.name,d.name,d.name,self.ad)) class Dog:
def __init__(self,name,kind,hp,ad):
self.name = name
self.kind = kind
self.hp = hp
self.ad = ad
def bite(self,p):
p.hp -= self.ad
print('%s咬了%s一口,%s掉了%s点血' % (self.name, p.name, p.name, self.ad)) alex = Person('a_sb','不详',1,5)
boss_jin = Person('金老板','女',20,50)
teddy = Dog('笨笨','teddy',50,10)
teddy.bite(alex)
print(alex.hp)
boss_jin.attack(teddy)
print(teddy.hp)
命名空间和作用域
class Person:
role = 'person' # 静态属性
def __init__(self,name,sex,hp,ad):
self.name = name # 对象属性 属性
self.sex = sex
self.hp = hp
self.ad = ad
def attack(self):
self.hobby = 'girl'
print('%s发起了一次攻击'%self.name) alex = Person('a_sb','不详',1,5)
alex.attack() # Person.attack(alex)
alex.age = 81
# alex --> Person
# Person实例化了alex
print(alex.__dict__)
alex.name #alex 指向我自己的内存空间 在自己的内存空间里找到name
alex.attack #alex 先找自己的内存空间 再找到类对象指针 再根据类对象指针找到类 再通过类找到attack
对象的内存空间里: 只存储对象的属性,而不存储方法和静态属性
方法和静态属性都存储在类的内存空间中
为了节省内存,让多个对象去共享类中的资源
命名空间和作用域
写一个类 完成一个功能 : 可以统计这个类有几个对象
class Foo:
count = 0
def __init__(self):
Foo.count += 1
f1 = Foo()
f2 = Foo()
f3 = Foo()
f4 = Foo()
f5 = Foo()
print(Foo.count) #
1.
class Life:
money = 10
def __init__(self,name):
self.name = name
def work(self):
print(self.name,'工作,赚了1000块钱')
# print(self.__dict__)
# print(Life.money)
# print(self.money)
self.money += 1000
father = Life('father')#father 工作,赚了1000块钱/
father.work()
print(father.money)
mother = Life('mother')
mother.work()
print(mother.money)
print(father.money)
# father.money = 10
print(father.__dict__)#{'money': 1010, 'name': 'father'}
print(Life.money)# 在对象的空间中新创建了一个字典self.money += 1000
2.
class Live:
money = [1]
def __init__(self,name):
self.name = name
def work(self):
print(self.name,'工作赚了1000块钱')
# print(self.money)
self.money[0] +=1000
father2 = Live('father2')
mother2 = Live('mother2')
father2.work()
mother2.work()
print(mother2.__dict__)#{'name': 'mother2'}
print(father2.money)
print(mother2.money)#[2001]
print(Live.money)#[2001]
print(Live.__dict__['money']) 由于传递的是可变类型的元素的改变,所以导致live.money的元素也发生改变
3.
class Live2:
money= [0]
def __init__(self,name):
self.name = name
def work(self):
print(self.name,'工作赚了1000块钱')
Live2.money = [Live2.money[0]+1000] father3 = Live2('father3')
mother3 = Live2('mother3')
mother3.work()
father3.work()
print(father3.__dict__)
print(Live2.money)
兑现属性是独有的,静态属性和方法是共享的
对象使用名字,先找自己内存空间中的,再找类的内存空间的
类名.静态变量;对于静态属性的修改,应该使用类名直接修改 面向对象实例
# 圆
# 计算圆的周长 2 pi r
# 计算圆的面积 pi r**2
# 5个圆
# 1,3,5,7,9
from math import pi
class Circle:
def __init__(self,r):
self.r = r
def cal_area(self):
'''
计算圆面积的方法
:return:返回值是float数据类型的面积
'''
return pi*self.r**2
def cal_perimeter(self):
'''
计算圆周长的方法
:return:返回值是float数据类型的周长
'''
return pi * self.r * 2
for i in range(1,10,2):
c1 = Circle(i)
print(c1.cal_area())
print(c1.cal_perimeter())
python:面向对象初级的更多相关文章
- python 面向对象初级篇
Python 面向对象(初级篇) 概述 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发" ...
- python面向对象初级(七)
概述 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发“更快更好更强...” 面向过程编程最易被初学 ...
- python 面向对象 初级
面向对象 与 面向过程 面向对象对象,是根据某个对象,进行编写对象属性,不考虑对象以外的因素,只对对象本事的一些属于自己的属性进行创造,不用考虑 业务之间的逻辑. 面向过程, 是按照业务的一步步发展进 ...
- python面向对象进阶(八)
上一篇<Python 面向对象初级(七)>文章介绍了面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使 ...
- python 面向对象(三大特性)
python 面向对象(初级) (思维导图 ↑↑↑↑↑) 概述: 面向过程:根据业务逻辑从上到下垒代码. 函数式:将某功能代码封装至函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类 ...
- python 高级之面向对象初级
python 高级之面向对象初级 本节内容 类的创建 类的构造方法 面向对象之封装 面向对象之继承 面向对象之多态 面向对象之成员 property 1.类的创建 面向对象:对函数进行分类和封装,让开 ...
- Python 面向对象(初级篇)
51CTO同步发布地址:http://3060674.blog.51cto.com/3050674/1689163 概述 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后 ...
- Python 面向对象(初级篇) (转)
概述 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发"更快更好更强..." 面 ...
- 第四篇:python 高级之面向对象初级
python 高级之面向对象初级 python 高级之面向对象初级 本节内容 类的创建 类的构造方法 面向对象之封装 面向对象之继承 面向对象之多态 面向对象之成员 property 1.类的创建 ...
- Python开发【第七篇】:面向对象 和 python面向对象(初级篇)(上)
Python 面向对象(初级篇) 51CTO同步发布地址:http://3060674.blog.51cto.com/3050674/1689163 概述 面向过程:根据业务逻辑从上到下写垒代码 ...
随机推荐
- 机器学习基础环境的安装与使用(MAC版)
使用到Matplotlib.Numpy.Pandans等库 1.创建虚拟环境 >>>> sudo pip3 install virtualenv >>>> ...
- L3-015 球队“食物链” (30 分)
L3-015 球队“食物链” (30 分) 某国的足球联赛中有N支参赛球队,编号从1至N.联赛采用主客场双循环赛制,参赛球队两两之间在双方主场各赛一场. 联赛战罢,结果已经尘埃落定.此时,联赛主席 ...
- SQL注入之Sqli-labs系列第四十七关,第四十八关,第四十九关(ORDER BY注入)
0x1 源码区别点 将id变为字符型:$sql = "SELECT * FROM users ORDER BY '$id'"; 0x2实例测试 (1)and rand相结合的方式 ...
- javascript中的Date对象
Date是什么? Date是日期类的构造函数 也是个对象,用于构造日期对象的实例. 有一个 now()方法,返回截止目前的时间戳(1970.1.1日始). Date.parse()接受 一定格式的日期 ...
- POJ - 1830:开关问题 (开关问题-高斯消元-自由元)
pro:有N个相同的开关,每个开关都与某些开关有着联系,每当你打开或者关闭某个开关的时候,其他的与此开关相关联的开关也会相应地发生变化,即这些相联系的开关的状态如果原来为开就变为关,如果为关就变为开. ...
- npm install 插件 --save与 --save -dev的区别
npm i 插件 ,会把插件安装到node_modules目录中,不会修改package.json, npm i 插件 --save ,项目发布上线之后还会依赖用到的插件,没有这些插件,项目不能 ...
- maven web工程 解决了pom.xml报错之后,maven web工程还是有个红色的叉叉 解决
这里之前有个红色叉叉 改完了pom.xml文件之后需要:右键工程-MavenMyEclipse-Update Project 刷新Maven web 工程,即可解决此问题
- Hibernate5.3 + mysql8.0遇到的问题
今天学习Hibernate看的是旧版本的视频Hibernate4.0版本 遇到几个新旧版本的区别. 1.方言,这个是因为SQL不是因为Hibernate 新版方言 2.将编译的类配置进congifur ...
- 第二次Scrum冲刺——Life in CCSU
第二次Scrum冲刺——Life in CCSU 一. 第二次Scrum任务 继续上一次冲刺的内容,这次完成论坛部分. 二. 用户故事 用户输入账号.密码: 用户点击论坛部分: 系统显示帖子: 用户选 ...
- PYTHON之路,线程
关于多任务的理解, 代码要执行,首先得变成机器认识的东西执行,那么需要解释器.那么执行按道理,一段程序在这里就具体来说一段代码的执行吧,我们知道代码的执行是从上至下按顺序执行,那么这里有条件分支结构, ...