类的命名空间&组合
类的命名空间
◆类中的静态变量可以被类调用也可以被对象调用
◆对不可变数据类型来说,类变量最好用类名操作
class Person:
money = 0
mother = Person()
father = Person()
Person.money += 1000
Person.money += 1000
print(Person.money)
◆对于可变数据类型来说,对象的修改是共享的,重新赋值是独立的
class Course:
langauage = 'Chinese'
def __init__(self,name,period,price,teacher):
self.name =name
self.period =period
self.price =price
self.teacher =teacher
def func(self):
pass
python = Course('python','six months',2000,'Wang')
print(python.__dict__)
print(python.langauage)
Course.langauage = 'English'
print(Course.langauage)# English
print(python.langauage)# English
python.langauage = '阿拉伯'
print(python.langauage)# 阿拉伯 没有修改类中的值而是在python这个对象的命名空间中增加了一项'langauage': '阿拉伯'
print(Course.langauage)# English
print(python.__dict__) # {'name': 'python', 'price': 2000, 'period': 'six months', 'langauage': '阿拉伯', 'teacher': 'Wang'}
class Foo:
count = 0
def __init__(self):
Foo.count += 1
f1 = Foo()
f2 = Foo()
print(f1.count)
print(f2.count)
f3 = Foo()
print(f3.count)
练习:创建一个对象,每实例化一个对象就计数。 最终所有对象都共享这个数据
绑定方法:
◆只有对象调用类内的方法的时候才有绑定方法的概念,
◆当对象调用类内的方法的时候就是把对象中的值传给这个方法的self,所以这个对象和这个方法就有了绑定关系
#普通函数
def func():pass
print(func) #<function func at 0x0000023DFAD0E488>
# 类
class Foo:
def func(self):
print('func')
f1 = Foo()
print(Foo.func) # <function Foo.func at 0x0000023DFAD0E950>
print(f1.func) #对象调用方法 ,把f1的值传给self f1和func发生了绑定
# <bound method Foo.func of <__main__.Foo object at 0x000001F5784E8780>>
print(f1) # <__main__.Foo object at 0x000001F5784E8780> 补充:导入包的过程,就相当于实例化一个对象,就会自动执行__init__.py文件
面向对象的三大特性 : 继承 多态 封装 组合 : 一个类的对象是另一个类对象的属性 如:alex.weapon 是 Weapon 类的对象 (alex.weapon 相当于 w)
# 狗
class Dog:
def __init__(self,name,aggr,blood,kind):
self.name = name
self.aggr = aggr
self.blood = blood
self.kind = kind
def bites(self,person):
person.blood -= self.aggr
# 人
class Person:
def __init__(self,name,aggr,blood,sex):
self.name = name
self.aggr = aggr
self.blood = blood
self.sex = sex
self.money = 0
def attack(self,dog):
dog.blood -= self.aggr def get_weapon(self,weapon):
# 首先判断玩家的money够不够买装备
if self.money >= weapon.price:
# 玩家买完武器之后money减少
self.money -= weapon.price
# 玩家有了武器
self.weapon = weapon
# 玩家的攻击力增加
self.aggr += weapon.aggr
else:
print('余额不足,请先充值')
# 武器装备
class Weapon:
def __init__(self,name,price,aggr,naijiudu):
self.name = name
self.price = price
self.aggr = aggr
self.naijiudu = naijiudu
# 大招
def hand18(self,person):
if self.naijiudu > 0 : # 如果还有耐久度
person.blood -= self.aggr * 2 # 被攻击的人的血就掉攻击者攻击力的两倍
self.naijiudu -= 1 # 耐久度减一 alex = Person('alex',0.5,100,'女')
jin = Dog('金老板',100,500,'泰迪')
w = Weapon('打狗棒',998,100,3)
# alex 装备打狗棒
alex.money += 1000
alex.get_weapon(w)
print(alex.aggr) # 100.5
print(alex.weapon) # <__main__.Weapon object at 0x000001C8C55886A0>
# alex 攻击 金老板
alex.attack(jin)
print(jin.blood) # 399.5
# alex使用大招攻击金老板
alex.weapon.hand18(jin)
print(jin.blood) # 199.5
人狗大战升级版
from math import pi
class Cricle:
def __init__(self,r):
self.r = r
def area(self):
return pi * self.r ** 2
def perimeter(self):
return 2 * pi * self.r class Ring:
def __init__(self,outside_r,inside_r):
self.outside_c = Cricle(outside_r) # Cricle(outside_r)是Cricle的对象,但是在这里是Ring类的属性
self.inside_c = Cricle(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())
栗子1:运用组合计算圆环的面积和周长
class Teacher:
def __init__(self,name,age,sex,brithday):
self.name = name
self.age = age
self.sex = sex
self.brithday = brithday
self.course = Course('alex',2000,'six months')
class Course:
def __init__(self,name,price,month):
self.name = name
self.price = price
self.month = month class Birthday:
def __init__(self,year,month,day):
self.year = year
self.month = month
self.day = day b = Birthday(2018,7,25)
alex = Teacher('alex',1,'女',b)
print(alex.name)
print(alex.brithday.year)
print(alex.brithday.month)
print(alex.brithday.day)
print(alex.course.price)
栗子2:用组合创建一个老师类,有生日且生日是一个类
类的命名空间&组合的更多相关文章
- day 23-1 类的命名空间、组合
类的命名空间 类与对象命名空间 类里 可以定义两种属性 静态属性 动态属性 类中的静态变量 可以被对象和类调用对于不可变数据类型来说,类变量最好用类名操作对于可变数据类型来说,对象名的修改是共享的,重 ...
- [Yii2.0] 以Yii 2.0风格加载自定义类或命名空间 [配置使用Yii2 autoloader]
Yii 2.0最显著的特征之一就是引入了命名空间,因此对于自定义类的引入方式也同之前有所不同.这篇文章讨论一下如何利用Yii 2.0的自动加载机制,向系统中引入自定义类和命名空间.本文旨在抛砖引玉,如 ...
- 速战速决 (5) - PHP: 动态地创建属性和方法, 对象的复制, 对象的比较, 加载指定的文件, 自动加载类文件, 命名空间
[源码下载] 速战速决 (5) - PHP: 动态地创建属性和方法, 对象的复制, 对象的比较, 加载指定的文件, 自动加载类文件, 命名空间 作者:webabcd 介绍速战速决 之 PHP 动态地创 ...
- Python 类的命名空间
Python中类的定义其实就是执行代码块: class cc: a=0 print '+++++', print a 会直接执行print语句而不是在实例化cc时执行.执行后会生成对应的类的命名空间. ...
- php加了命名空间没引入初始化文件:类的命名空间要与文件夹名一致namespace Business\Event;缺少了Event
php加了命名空间没引入初始化文件:类的命名空间要与文件夹名一致namespace Business\Event;缺少了Event
- 编译不通过:提示XXXX不是类或命名空间名 的解决办法
手动写了一个类,需要引入预编译头stdafx.h.结果编译时提示XXXX不是类或命名空间名. 处理方法:将#include "stdafx.h"放在最前面.
- 类型或命名空间名称“Interop”在类或命名空间“Microsoft.Office”中不存在(是否缺少程序集引用?)
准备用C#编写Web程序,生成Excel报表,在使用下面语句时报错. using Microsoft.Office.Interop.Excel; 报错信息:类型或命名空间名称“Interop”在类或命 ...
- day23 01 类的命名空间
day23 01 类的命名空间 一.初识面向对象复习 定义类: class 函数:方法 动态属性 变量:类属性 静态属性 过程: (1)_init_方法:初始化:def _init_(self,参数 ...
- C#初始类和命名空间
本节内容: 1.剖析Hello,World程序 1.1初始类(class)与名称空间(namespace) 2.类库的引用 2.1DLL的引用(黑盒引用) 2.2项目引用(白盒引用) 2.3建立自己的 ...
随机推荐
- vue-resource post请求后台接口报400(跨域问题解决方法)
1.打开config/index.js,在proxyTable中添写如下代码 proxyTable: { '/api': { //使用"/api"来代替"http://f ...
- 网络流24题——圆桌问题 luogu 3254
题目传送门:这里 这是网络流24题里最简单的一道,我们从这里开始 虽然是网络流24题之一,但可以不用网络流... 本题采用贪心即可 有一个很显然的思想:在分配每一组时,我们都应当优先分配给当前可容纳人 ...
- Angular项目中核心模块core Module只加载一次的实现
核心模块CoreModule在整个系统中只加载一次,如何实现? 创建core Modele:ng g m core 既然CoreModule是类,就有构造函数,在构造函数中进行依赖注入. export ...
- [BZOJ4913][SDOI2017]遗忘的集合
题解: 首先先弄出$f(x)$的生成函数$$f(x)=\prod_{i=1}^{n} {{(\frac{1}{1-x^i})}}^{a[i]}$$因为$f(x)$已知,我们考虑利用这个式子取推出$a[ ...
- python开发环境搭建及numpy基本属性-【老鱼学numpy】
目的 本节我们将介绍如何搭建python的开发环境以及numpy的基本属性,这样可以检验我们的numpy是否安装正确了. python开发环境的搭建 工欲善其事必先利其器,我用得比较顺手的是Intel ...
- sklearn交叉验证-【老鱼学sklearn】
交叉验证(Cross validation),有时亦称循环估计, 是一种统计学上将数据样本切割成较小子集的实用方法.于是可以先在一个子集上做分析, 而其它子集则用来做后续对此分析的确认及验证. 一开始 ...
- phpstorm对laravel的一些使用技巧
安装laravel插件,设置ctrl+alt+s 二 安装智能提示插件 composer require barryvdh/laravel-ide-helper 在config/app.php的pro ...
- linux(CentOS)磁盘挂载数据盘
linux(CentOS)磁盘挂载数据盘:第一步:查看是否存在需要挂载的磁盘: sudo fdisk -l 第二步:为需要挂载的磁盘创建分区: sudo fdisk /dev/vdb 执行中:依次选择 ...
- Spark环境搭建(三)-----------yarn环境搭建及测试作业提交
配置好HDFS之后,接下来配置单节点的yarn环境 1,修改配置文件 文件 : /root/app/hadoop-2.6.0-cdh5.7.0/etc/hadoop/yarn-site-xml 插入 ...
- Android系统源代码目录结构 “Android源代码”“目录结构”
在讲述Android源码编译的三个步骤之前,将先介绍Android源码目录结构,以便读者理清Android编译系统核心代码在Android源代码的位置. Android源代码顶层目录结构如下所示: ├ ...