python学习 day19 (3月26日)----(对象组合)
深谙:非常透彻地了解;熟悉内中情形。谙,读作‘ān’ 熟悉。
1.面向对象作用:
规划了代码中的函数处理的是哪一类问题
解决了传参的问题
方便扩展
方便重用
2.类的定义和使用
类当中有哪些成员
'''
静态变量
动态变量,对象方法
'''
类: 有相同特征的事物归为一类
对象、实例: 类的具体化
实例化: 通过类创造一个对象的过程
对象 = 类名(参数,对象)
'''
1, 开辟一块内存空间,让self指向他
2,调用__init__方法,执行init
3,把self 返回给调用者
'''
'''
对象可以存哪些方法
#所有的对象属性都在对象里
类名能做什么
#查看静态变量
#实例化对象
对象名能做什么
#属性的增删改查
#方法的调用
'''
3类的加载顺序
#1. 类内部一个缩进的所有代码 都是在py文件从上到下开始解释的时候就已经被执行了
#2. 类中的代码 永远是 从上到下依次执行的
class A:
print(123)
def __init__(self):
print('执行我啦!')
def func(self):
print('adjia')
def func(self):
print('adj',A.country)
country = 'China'
country = 'Chi'
'''
执行第一层缩进 #123
a = A() #执行我啦!
a.func() #adj Chi 从上往下执行 和变量一样
'''
4.类的命名空间
类和对象中的内容是分两片存储的
对象 里的指针可以用 类里的函数 正常使用静态的变量
class Student:
country = 'China'
def __init__(self,name,country):
self.name = name
self.country = country
zhang = Student('刘大','中国')
zou = Student('王二','China')
print(Student.country)
print(zou.country)
print(zhang.country)
对象去找类空间中的名字 的前提:在自己的空间中没有这个名字
class Student:
country = 'China'
def __init__(self,name):
self.name = name
zhang = Student('刘大')
zou = Student('王二')
print(zhang.country)
Student.country = '法国人'
print(zhang.country)
zou.country = '日本人'
print(zou.country)
所以,在操作 静态变量的时候 应该尽量使用类名来操作而不是使用对象名
比如:用类 和 用self 的区别是什么?
class Person:
money = 0
def __init__(self,name):
self.name = name
def salary_deliery(self):
Person.money += 1000
return Person.money
a = Person('刘大').salary_deliery()
print(a)
练习:
class A:
Count = 0
def __init__(self,name,age,sex):
self.name = name
A.Count += 1
self.age = age
A.Count += 1
self.sex = sex
A.Count += 1 a = A('刘大','王二','张三')
print(A.Count)
赋值和使用变量
class A:
Count = 0
def __init__(self,name,age,sex):
self.name = name
A.Count += 1
self.age = age
A.Count += 1
self.sex = sex
A.Count += 1
a = A('刘大','王二','张三')
print(A.Count)
class B:
l = [0]
def __init__(self,name):
self.name = name
b1 = B('刘大')
b2 = B('王二')
print(B.l)
print(b1.l)
print(b2.l)
b1.l[0]+=1 #赋值 1
print(b2.l[0])
b1.l = [123]
print(b2.l[0]) #
print(b1.l[0]) #
# 只要是对一个对象 ,名字直接赋值,那么就是在这个对象的空间内创建了新的属性
# 只要是对一个可变的数据类型内部的变化,那么仍然是所有的对象和类共享这个改变的成果 #所有的静态变量都是用类名来操作 ,这样修改就能被所有的对象感知到
#如果是对于可变数据类型的静态变量 操作的是这个数据内部的内容,也可以使用对象来调用
#对象 和 类名 是一样的 静态变量最好是可变的
区别在哪?
class Person:
money = 0
def __init__(self,name):
self.name = name
def salary_deliery(self):
Person.money += 1000
return Person.money
a = Person('刘大').salary_deliery()
print(a) #
class Person:
money = 0
def __init__(self,name):
self.name = name
def salary_deliery(self):
self.money += 1000
return self.money
a = Person('刘大').salary_deliery()
print(a) #
5.组合
圆类
from math import pi
#圆类
class Circle:
def __init__(self,r):
self.r = r
def area(self):
return 3.14*self.r**2
def perimeter(self):
return 2*self.r*3.14
#圆环类
class Ring:
def __init__(self,r1,r2): # 属性 和 对象 相对应了
c1 = Circle(r1)
c2 = Circle(r2)
if c1.r > c2.r:
self.outer = c1 # 组合
self.inner = c2
else:
self.inner = c1
self.outer = c2
def area(self):
return self.outer.area() - self.inner.area()
def perimeter(self):
return self.outer.perimeter() + self.inner.perimeter()
# 圆柱类
# a = Circle(2)
# print(a.area())
a = Ring(12,3)
print(a.area())
print(a.perimeter())
class C3d:
def __init__(self,r,h):
self.r = r
self.h = h
c1 = Circle(r)
self.area = c1
def area(self):
c_area = self.area.area()
rec_area = self.area.perimeter() *self.h
return c_area*2 + rec_area def vic(self):
c_area = self.area.area()
return c_area*self.h
'''
#耦合
# 紧耦合
#圆形面积的公式 和 类中方法
#组合:
#一个类的对象是另一个类对象的属性
#圆形类的对象 是圆环类对象的outer 属性的值 # 计算圆形 相关数据的公式 只和Circle 类在一起
#其余的 用到 公式的地方都是通过Circle 类来使用的
# 公式与 其他类之间的关系 是一个“松耦合”关系
'''
学生类
利用的Date 的类 作为参数 传给另一个类的对象
#学生类
# 入学日期
# 开学日期
#日期的粒度 精确到年月日 # "2019-9-12"
# 年
# 月
# 日
class Date:
def __init__(self,year,month,day):
self.year = year
self.month = month
self.day = day
def date(self):
return '%s-%s-%s'%(self.year,self.month,self.day)
class Student:
def __init__(self,name,num,birth,in_shcool,start_day):
self.name = name
self.num = num
self.birth = birth #组合 开始 后面都是 组合 用的class date
self.in_school = in_shcool
self.start_day= start_day
d1 = Date(2000,1,1)
d2 = Date(2018,12,1)
d3 = Date(2019,2,1)
liu = Student('刘大',10086,d1,d2,d3)
print(liu.birth.year)
print(liu.birth.month)
这种不行 只是单纯的赋值 没有改变 具体课程的元素
class Student:
def __init__(self,name,num,course):
self.name = name
self.num = num
self.course_name = course.name #没有把python 耦合在一起 只把 课程弄在一起
类似例子
写两个类 一个是 课程类 : (写上变量) name , price ,period
一个是学生类 name , num , 课程(传过来)
课程= Course(三个变量)
学生 = Student(两个变量,课程)
class Student:
def __init__(self,name,num,course):
self.name = name
self.num = num
self.course = course
class Course:
def __init__(self,name,price,period):
self.name = name
self.price = price
self.period = period
python = Course('python',25000,'6 months')
s1 = Student('任世龙',10085,python)
s2 = Student('任希同',10084,python)
s3 = Student('董鹏',10083,python)
print(s1.__dict__)
print(s1.course.price)
python.price = 30000
python.period = '7 months' s3 = Student('董鹏',10083,python)
print(s3.__dict__.values()) # 就学生的那三个属性
print(s1.course.__dict__) # 课程的三个属性
6. 人狗大战
#__author : 'liuyang'
#date : 2019/3/26 0026 下午 12:03
class Dog:
a = 1000
def __init__(self,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('%s 咬了 %s,%s 掉了 %s血'%(self.name,person.name,person.name,self.ad))
class Person:
a = 1000
def __init__(self,name,hp,ad,sex,money):
print('执行了')
print(name,hp,ad,sex)
self.name = name
self.hp = hp
self.ad = ad
self.type = sex
self.money = money
self.beg = []
def jian23(self,dog):
dog.hp -= 2000
#想怎么设计就怎么设计
print("%s 被 %s 击中了,掉了2000,当前%s的血量为%s"%(self.name,dog.name,dog.name,dog.hp))
def fight(self,dog): #定义在类的内部的 动态变量 方法
dog.blood -= self.ad
print('%s 打了 %s , %s 掉了 %s血'%(self.name,dog.name,dog.name,self.ad))
def buy_weapon(self,weapon):
#武器列表 #死亡之舞
if weapon.price < self.money:
self.money -= weapon.price
self.money = round(self.money, 2)
self.beg.append(weapon)
print('购买%s成功,您当前的余额是%s'%(weapon.name, self.money))
else:
print('您的余额不足,请重置后恢复')
def use_weapon(self):
# for wea in self.beg:
# print(wea)
return self.beg
# if wea == 'weapon':
# self.weapon = wea #组合
# self.hp += wea.hp
# self.ad += wea.ad
# break
#level 1
# 回合制的游戏
class weapon:
# 装备
# 名字
# 价格
# 属性
# 技能
def __init__(self,name,price,ad,hp):
self.name = name
self.price = price
self.ad = ad
self.hp = hp
# 买装备
#人的余额 >= 商品的价格
#能否命中 暴击
liuda = Person('liuda',100,1,'男',20000000)
huang = Dog('huang',1000,10,'公')
zhuan = weapon('绝世好剑',2000000,1000,1000)
liuda.buy_weapon(zhuan)
print(liuda.use_weapon())
# print(liuda.beg)
# liuda.use_weapon()
# print(liuda.use_weapon())
# print(liuda.weapon.name)
# 一个对象 和另一个对象 通过另一个属性 关联在一起了
#人有 武器
#人是 一个 类
#武器 也是 类
#人 关联 武器
#人用武器招式
#总结
#类的加载顺序
#类的对象的命名空间
7.堆栈
# 数据结构 栈
# 数据结构 队列 # list dict tuple set str
# c :数组 链表 结构体
# 树 堆 栈 队列
# 树
# 平衡树 二叉树 红黑树
# 堆
# 最大值堆 最小值堆
# 堆排序
# 栈
# 后进先出 LIFO
# 队列
# 先进先出 FIFO import queue
# q = queue.Queue(3)
# print(q.qsize())
# print(q.empty())
# print(q.full())
# q.put(1)
# q.put('ancdf')
# q.put([1,2,3])
# print('已经放了3个')
# q.put([1,2,3])
# print('已经放了4个')
# print(q)
# print(q.get())
# print(q.get())
# print(q.get())
# print(q.get()) # 有一个服务
# 火车票购票服务 # 后进先出
# import queue
# lifoq = queue.LifoQueue()
# lifoq.put(1)
# lifoq.put(2)
# lifoq.put(3)
# lifoq.put(4)
# lifoq.put(5)
# print(lifoq.get())
# print(lifoq.get()) # def func2():
# print('345')
#
# def func1():
# func2()
# print('234')
#
# def main():
# func1()
# print('123')
#
# main() # 栈 在底层的数据结构 再很多算法中 解决问题的时候必须用到这种数据结构
老师说: 8k 10k 15k靠技术 25k 靠态度
python学习 day19 (3月26日)----(对象组合)的更多相关文章
- Python 学习日志9月20日
9月20日 周三 多大年龄了,还活得像个小孩.——急什么,人生又不长. 你习惯了思考宇宙星辰,一百年真的不长,一生也就不那么长,许多人的价值观念你也就无法理解.同样,许多人也无法理解你的价值观念,感兴 ...
- Python 学习日志9月19日
9月19日 周二 今天是普通的一天,昨天也是普通的一天,刚才我差点忘记写日志,突然想起来有个事情没做,回来写. 今天早晨学习<Head First HTML and CSS>第十一章节“布 ...
- Python学习日志9月17日 一周总结
周一,9月11日 这天写的是过去一周的周总结,我从中找出当天的内容. 这天早晨给电脑折腾装机,早晨基本上没有学习,休息了一个早晨. 下午写的上周总结,完事做mooc爬虫课的作业,<Think P ...
- Python 学习日志9月21日
9月21日 周四 今天是个特殊的日子吗,总感觉9月21这个日子听着怪怪的. 今天早晨看<Head First HTML and CSS>第13章节“表格和更多列表”,内容不多,看完并做了详 ...
- python学习 day21 (3月28日)----(抽象类 多态 nametuple dump)
不要因为走的路太久了,而忘记了为了什么而出发. 提前作准备了吗?把思维导图的东西做了吗? 和工作了几年的人,相比,是不是相同的水平,如果要写简历的话. 一边学习,一边复习. 小就是大,少就是多. 1. ...
- Python学习日志9月13日
昨天的学习日志没有写,乱忙了一整天,政治电脑. 好奇心重,想要给电脑装上传说中LInux操作系统,各种小问题折腾到半夜,今天又折腾到晚上才真正的装上系统. 可是装上系统后又发现各种的不好用.虽然界面比 ...
- Python学习日志9月16日
刚才我差点睡着了,差资料的时候太费神,有些累. 今天早晨学习了<head first HTML and CSS>,今天把昨天没看了的关于字体和颜色的一章节看完了,真长.我详细的做了笔记,并 ...
- Python学习日志9月15日
一周就要过去了,而我跟一周以前没什么区别.回想一下,我这周做了什么事情呢.恍然若失.这周的精力都浪费在很多不必要的事情上了.学过一片古文,讲后羿学射箭,他有一个同学跟他一样聪明,在一起学习.后羿呢,专 ...
- Python学习日志9月14日
今天早晨又没有专心致志的学习,我感觉我可能是累了,需要减轻学习的程度来调整一下咯.这几天装电脑弄的昏天暗地的,身体有点吃不消了.时间真是神奇的魔法,这半个月来,每隔几天都有想要改变策略的想法.今天早晨 ...
随机推荐
- WINDOWS内核版本
Windows NT (NT=new technology) WOW64(Windows-on-Windows 64bit) 如何获取Windows 内核版本 1. cmd (win+r) 2. V ...
- 【Linux 进程】exec族函数详解
exec族的组成: 在Linux中,并不存在一个exec()的函数形式,exec指的是一组函数,一共有6个,分别是: #include <unistd.h> extern char **e ...
- ubuntu系列-安装google浏览器
转载:http://www.linuxidc.com/Linux/2013-10/91857.htm 对于刚刚开始使用Ubuntu并想安装谷歌Chrome浏览器的新用户来说,本文所介绍的方法是最快捷的 ...
- 使用SqlBulkCopy批量插入数据,测试20万条用时5秒
using System;using System.Collections.Generic;using System.Linq;using System.Text; using System.Data ...
- linux命令学习之:echo
echo命令用于在shell中打印shell变量的值,或者直接输出指定的字符串.linux的echo命令,在shell编程中极为常用, 在终端下打印变量value的时候也是常常用到的,因此有必要了解下 ...
- linux命令学习之:df
df命令用于显示磁盘分区上的可使用的磁盘空间.默认显示单位为KB.可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息. 语法 df (选项) (参数) 选项 -a或--all:包含全部 ...
- Android的事件分发机制
public boolean dispatchTouchEvent(MotionEvent event) 通过方法名我们不难猜测,它就是事件分发的重要方法.那么很明显,如果一个MotionEvent传 ...
- win10下安装配置mysql-8.0.13
1.下载mysql-8.0.13安装包 https://dev.mysql.com/downloads/mysql/ 选择zip安装包下载就好. 2.解压到你要安装的目录 3.创建my.ini配置文件 ...
- IE6、7下overflow:hidden失效的问题
问题产生原因: 当父元素的直接子元素或者下级子元素的样式拥有position:relative或者position:absolute属性时,父元素的overflow:hidden属性就会失效. 例如: ...
- Linux硬件相关
1)查看设备号/厂商号 http://blog.csdn.net/styshoo/article/details/51203881 二.硬件厂商 1)瑞传科技股份有限公司 https://www. ...