一. 类和对象命名空间
类里 可以定义两种属性:
1. 静态属性
2. 动态属性
class Course:
language = 'Chinese'
def __init__(self, teacher, course_name, period, price):
self.teacher = teacher # 授课老师
self.name = course_name # 课程名字
self.period = period # 课程周期
self.price = price # 课程价格 def func(self):
pass python = Course('egon', 'python', '6 months', 20000) print(Course.language)
Course.language = 'English' # 这种方式可以修改静态属性,但通过Course.__dict__['language'] = 'English' 修改不了
print(Course.language) linux = Course('oldboy', 'linux', '6 months', 18000)
print(python.language) python.language = 'INS'
print(Course.language)
print(python.language)
print(linux.language) print(python.__dict__)
print(linux.__dict__)
 # linux 比python少了一个language,说明python创建了一个language = 'INS',
# 但Course里面的language并不会变
# 但这样的话就永远用不到Course里面的language了
# 把python里面的删除就可以了:
del python.language
print(python.language)
对于 不可变数据类型 来说,类变量最好用类操作,而不适合用对象操作
对于 可变数据类型 来说,对象名的修改是共享的,重新赋值是独立的 类中的静态变量,可以被对象和类调用
上面说的是对于不可变类型,那么对于可变数据类型呢?
class Course:
language = ['Chinese']
def __init__(self, teacher, course_name, period, price):
self.teacher = teacher # 授课老师
self.name = course_name # 课程名字
self.period = period # 课程周期
self.price = price # 课程价格 def func(self):
pass python = Course('egon', 'python', '6 months', 20000) Course.language[0] = 'English'
print(Course.language) linux = Course('oldboy', 'linux', '6 months', 18000) # python.language[0] = 'INS'
# print(Course.language)
# print(python.language)
# print(linux.language) # 三个都变成了'INS', 列表里面的值改变了,但不改变列表所在的内存地址 # 但是,如果这样写
python.language = ['Ins']
print(Course.language)
print(python.language) # 依然只有python.language变了, 相当于 重新赋值
print(linux.language) # 创建一个类,每实例化一个对象就记录下来
# 最终所有的对象共享这个数据 class Foo:
count = 0
def __init__(self):
Foo.count += 1
f1 = Foo()
f2 = Foo()
f3 = Foo()
print(f1.count)
print(f2.count)
print(f3.count)
print(Foo.count) # 通过类名就可以知道实例化了多少个对象
# 函数名不要和静态属性重名
# 认识绑定方法

def func():pass
print(func) class Foo:
def func(self):
print('func')
f1 = Foo()
print(Foo.func)
print(f1.func)
print(f1)

二. 组合

 # 面向对象的三大特性:继承 多态 封装 -- 之后学
# 组合
# 人狗大战 class Dogs:
def __init__(self,name ,HP, aggr, kind):
self.name = name
self.HP = HP
self.aggr = aggr
self.kind = kind def bite(self,person):
person.HP -= self.aggr class Person:
def __init__(self,name ,HP, aggr, sex):
self.name = name
self.HP = HP
self.aggr = aggr
self.sex = sex
self.money = 0 def attack(self,dog):
dog.HP -= self.aggr def get_weapon(self,weapon):
if self.money >= weapon.price:
self.money -= weapon.price
self.weapon = weapon
self.aggr += weapon.aggr
else:
print('余额不足, 请充值')
class Weapon: # 定义一个装备类
def __init__(self, name, aggr, naijiu, price):
self.name = name
self.aggr = aggr
self.naijiu = naijiu
self.price = price def hand_18(self, peason):
if self.naijiu > 0:
peason.HP -= self.aggr * 2
self.naijiu -= 1
alex = Person('alex', 100, 1, '不详')
jin = Person('金老板', 200, 2, '泰迪')
weapon = Weapon('打狗棒', 5, 100, 9.9) # 装备
# 增加伤害
# 增加血量
# 给alex装备打狗棒
# 打不过金老板,于是 充钱买装备
alex.money += 1000
alex.get_weapon(weapon)
print(alex.weapon)
print(alex.aggr)
alex.attack(jin)
print(jin.HP) alex.weapon.hand_18(jin)
print(jin.HP) # 组合:一个对象的属性值是另外一个类的对象
# alex.weapon 是 Weapon 类的一个对象

三. 组合的一些小练习

 创建一个圆环类

 from math import pi
class Circle:
def __init__(self, r):
self.r = r
def area(self):
return self.r ** 2 * pi
def perimeter(self):
return 2 * pi * self.r class Ring:
def __init__(self,outside_r, inside_r):
self.outside_c = Circle(outside_r)
self.inside_c = Circle(inside_r)
def area(self):
return self.outside_c.area() - self.inside_c.area()
def perimeter(self):
return self.outside_c.perimeter() + self.inside_c.perimeter() ring = Ring(20, 10)
print(ring.area())
print(ring.perimeter())

 # 创建一个老师类
# 老师有生日
# 生日也是一个类:年、月、日 三个属性
# 组合实现 class Teacher:
def __init__(self,name, age, sex, birthday):
self.name = name
self.age = age
self.sex = sex
self.bir = birthday
self.course = Course('python','6 month',20000) class Course:
def __init__(self, course_name, period, price):
self.name = course_name # 课程名字
self.period = period # 课程周期
self.price = price # 课程价格 class Birthday:
def __init__(self, year, month, day):
self.year = year
self.month = month
self.day = day
birthday = Birthday(2017, 3, 20)
teacher = Teacher('KID', 21, '女', birthday)
print(teacher.name)
print(teacher.bir.year)
print(teacher.bir.month)
print(teacher.course.price)
 
												

python学习之老男孩python全栈第九期_day023知识点总结——类和对象命名空间、组合的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    '''数据类型:intbool... 数据结构:dict (python独有的)listtuple (pytho独有的)setstr''' # reverse() 反转l = [1,2,3,4,5]l ...

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

    # 作用域相关(2)locals() # 返回本地作用域中的所有名字 globals() # 返回全局作用域中的所有名字 # 迭代器/生成器相关(3)range()print('__next__' i ...

随机推荐

  1. [javascript]——移动端 HTML5 图片上传预览和压缩

    在开发移动端web网页中,我们不可避免的会遇到文件上传的功能,但由于手机图片尺寸太大,上传时间过长导致用户体验太差,就需要在上传前对图片进行一定的压缩. 在代码之前,有必要先了解我们即将使用到的几个A ...

  2. redis-server.exe双击闪退 win10系统

    博客 解决方法: 1-win+R 打开命令行 2-cd至redis目录,例如 D:\redis> 3-输入 redis-server.exe redis.windows.conf     4-若 ...

  3. CF1083(Round #526 Div. 1) 简要题解

    题目链接 https://codeforces.com/contest/1083 简要题目翻译 题解 A. The Fair Nut and the Best Path 可以忽略掉"任意时刻 ...

  4. SPSS学习系列之SPSS Statistics的菜单栏介绍(图文详解)

    不多说,直接上干货! 以下是菜单栏 1.以下是文件栏: 2.以下是编辑栏 3.以下是查看栏   4.以下是数据栏: 5.以下是转换栏: 6.以下是分析栏: 7.以下是直销栏: 8.以下是图形栏: 9. ...

  5. maven项目debug调试不能够进入源码问题解决

    Maven项目在debug调试模式的时候,进入调试模式,但是没有进入源码界面. 上述问题的解决方法如下: 第一步: 第二步: 第三步: 第四步: 第五步: 到这里就解决了:

  6. 《python灰帽子》学习笔记:写一个windos 调试器(一)

    一.开发内容介绍 为了对一个进程进行调试,你首先必须用一些方法把调试器和进程连接起来.所以, 我们的调试器要不然就是装载一个可执行程序然后运行它, 要不然就是动态的附加到一个运行的进程.Windows ...

  7. 1-2 Mobx 入门实践之TodoList(官方Demo)

    第一步:导入模块 import React, { Component } from 'react'; import { observable, autorun,computed } from 'mob ...

  8. Linux网络编程--多线程实现echo服务器与客户端“一对多”功能,是网络编程的“Hello World!”

    在linux平台下,用多线程实现echo服务器与客户端“一对多”(即是一台服务器可以响应多个客户端的请求).本人写了个demo,和大家一起分享,有不足的地方,请多多指教,我是壮壮熊. 编译时,在后面加 ...

  9. 一文带你入门图像分析,成为AI专家不是梦!

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯云AI中心发表于云+社区专栏 腾讯云高级研究员讲述,从成像到图像分析如何入门 文︱冀永楠 "AI来了"邀请到我 ...

  10. Maven 打包的时候报 Failed to execute goal org.codehaus.mojo:native2ascii-maven-plugin

    错误信息: [ERROR] Failed to execute goal org.codehaus.mojo:native2ascii-maven-plugin:1.0-alpha-1:native2 ...