Python进阶-XV 类和对象的命名空间 组合
一、类和对象命名空间
1.类中可以定义两种属性
静态属性和动态属性
class Course:
language = 'Chinese' # 静态属性
def __init__(self, name, score, teacher): # 动态属性
self.name = name
self.score = score
self.teacher = teacher def take(self):
'''
被选修
:return:
'''
pass
2)访问类中静态属性的两种方式:
print(Course.language)
print(Course.__dict__['language']) python = Course('Python', 99, 'Mr Wang')
java = Course('JAVA', 97, 'Mrs Liu')
3)对象无法改变类中的静态属性,如果其为不可变类型的话!
python.language = 'English'
print(python.language) # English
print(Course.language) # Chinese
print(java.language) # Chinese
# 查看一下python对象中的属性:新增加了一个language属性,将类中的静态属性覆盖了!但是无法改变类中的属性!
print(python.__dict__) #{'teacher': 'Mr Wang', 'name': 'Python', 'score': 99, 'language': 'English'}
4)如果类中的静态属性是可变数据类型,其值是可以被改变的,但是属性所对应的内存地址一直没变!
lass Lamp:
product_from = ['China'] desk_lamp = Lamp()
stree_light = Lamp() print(id(Lamp.product_from))
desk_lamp.product_from[0] = 'Vietnam'
print(Lamp.product_from)
print(id(Lamp.product_from))
5)小结
# 类中的静态变量 可以被对象和类调用
# 对于不可变数据类型来说,类变量最好用类名操作
# 对于可变数据类型来说,对象名的修改是共享的,重新赋值是独立的
2、例子1:计算类被实例的次数
class Foo:
count = 0
def __init__(self):
Foo.count += 1 f1 = Foo()
f2 = Foo()
print(Foo.count)
3、绑定方法
# 已经了解到,类中的函数叫方法,绑定方法就是类中的方法,被对象调用时,
# 就绑定了该对象,能使用该对象的所有属性!
# 1)、例子2:模拟人生
class Person:
money = 0
def earn_salary(self):
Person.money += 1000 mother = Person()
father = Person()
mother.earn_salary() # 这就是绑定方法
father.earn_salary() # 这也是绑定方法
print(Person.money)
print(Person.earn_salary) # <function Person.earn_salary at 0x0000022B50B3E730>
print(mother.earn_salary) # <bound method Person.earn_salary of <__main__.Person object at 0x000001775E0E3AC8>>
2) 联想到每个包中都有一个__init__.py
# 每当import package 时,其实就是一个类的实例化的过程;
# 如:import time
# time.time() time方法绑定了一个time对象
4、总结
# 类里的名字有 类变量(静态属性量)+ 方法名(动态属性)
# 对象里的名字 对象属性
# 对象 —— > 类
# 对象找名字 : 先找自己的 找类的 再找不到就报错
# 对象修改静态属性的值
# 对于不可变数据类型来说,类变量最好用类名操作
# 对于可变数据类型来说,对象名的修改是共享的,重新赋值是独立的
二、组合的用法
# 还是从人狗大战引入组合的概念
# 人和狗大战了,如果人的攻击力太弱,怎么办?
# 可以增加一个武器啊!
class Person:
def __init__(self, name, age, hp, aggr, ginder, money):
self.name = name
self.age = age
self.hp = hp
self.aggr = aggr
self.ginder = ginder
self.money = money def fight(self, dog):
dog.hp -= self.aggr def get_weapon(self, weapon):
self.weapon = weapon class Dog:
def __init__(self, name, aggr, hp, kind):
self.name = name
self.aggr = aggr
self.hp = hp
self.kind = kind def bite(self, person):
person.hp -= self.aggr class Weapon:
def __init__(self, name, price, aggr):
self.name = name
self.price = price
self.aggr = aggr def attack(self, dog):
dog.hp -= self.aggr tom = Person('tom', 22, 500, 100, 'man', 2000)
little_white = Dog('little_white', 150, 300, 'Labrador')
print('被武器袭击前的狗的生命值:', little_white.hp)
weapton = Weapon('Knife', 2000, 300)
if tom.money >= weapton.price:
tom.get_weapon(weapton)
tom.weapon.attack(little_white)
print('被武器袭击后的狗的生命值:', little_white.hp)
else:
print('余额不足,请充值!')
从上例子可以看到组合的使用,由此可以定义了:
组合 :一个对象的属性值是另外一个类的对象
alex.weapon 是 Weapon类的对象
即一个对象有另外一个对象
Python进阶-XV 类和对象的命名空间 组合的更多相关文章
- python进阶:类和对象
@修饰符:将被修饰的函数作为参数,运行修饰函数 实例方法: 静态方法:@staticmethod 类方法:@classmethod 自省:通过一定的机制查询到对象的内部结构 序列类: 列表推导式(例表 ...
- python入门17 类和对象
类:一类事物的抽象化.概念: 类的变量(属于类的变量,定义在类的开始处) 成员变量(self.变量) 类的方法( @classmethod,cls参数) 成员方法( self参数 ) 静态方法 ...
- Python之面向对象类和对象
Python之面向对象类和对象 定义一个类:class 定义类的语法: class Test(object): """ 类里定义一类事物共同的技能. 可以是变量,也可是函 ...
- Python中的类、对象、继承
类 Python中,类的命名使用帕斯卡命名方式,即首字母大写. Python中定义类的方式如下: class 类名([父类名[,父类名[,...]]]): pass 省略父类名表示该类直接继承自obj ...
- 初识python中的类与对象
这篇博客的路线是由深入浅,所以尽管图画的花花绿绿的很好看,但是请先关注我的文字,因为初接触类的小伙伴直接看类的实现可能会觉得难度大,只要耐着性子看下去,就会有一种“拨开迷雾看未来”的感觉了. 一.py ...
- python中的类,对象,方法,属性等介绍
注:这篇文章写得很好.加底纹的是我自己的理解 python中一切皆为对象,所谓对象:我自己就是一个对象,我玩的电脑就是对象,坐着的椅子就是对象,家里养的小狗也是一个对象...... 我们通过描述属性( ...
- Python进阶_类与实例
上一节将到面对对象必须先抽象模型,之后直接利用模型.这一节我们来具体理解一下这句话的意思. 面对对象最重要的概念就是类(class)和实例(instance),必须牢记类是抽象的模板,比如studen ...
- Python 面向对象(创建类和对象,面向对象的三大特性是指:封装、继承和多态,多态性)
概念: ...
- Python里的类和对象简介
---恢复内容开始--- Python里的类 对象=属性+方法: 对象的属性主要是指主要的特征和参量,而方法主要是指函数: 类是一个具有一定特征和方法的集合,而对象是类的一个:类和对象的关系就如同模 ...
随机推荐
- 初学Python之爬虫的简单入门
初学Python之爬虫的简单入门 一.什么是爬虫? 1.简单介绍爬虫 爬虫的全称为网络爬虫,简称爬虫,别名有网络机器人,网络蜘蛛等等. 网络爬虫是一种自动获取网页内容的程序,为搜索引擎提供了重要的 ...
- Codeforces Round #598 (Div. 3) F. Equalizing Two Strings 构造
F. Equalizing Two Strings You are given two strings s and t both of length n and both consisting of ...
- Python画一棵漂亮的樱花树(不同种樱花+玫瑰+圣诞树喔)
不少用Python(大多是turtle库)绘制的树图,感觉很漂亮,我整理了一下,挑了一些我觉得不错的代码分享给大家(这些我都测试过,确实可以生成喔~)one 樱花树 动态生成樱花效果图(这个是动态的) ...
- MySQL索引知识学习笔记
目录 一.索引的概念 二.索引分类 三.索引用法 四 .索引架构简介 五.索引适用的情况 六.索引不适用的情况 继我的上篇博客:Oracle索引知识学习笔记,再记录一篇MySQL的索引知识学习笔记,本 ...
- 百度API车牌识别——Restful方式
源码下载地址:https://download.csdn.net/download/redhat588/11798294 Delphi xe 10.3.2 for windows 7 环境编译通过! ...
- java高并发系列 - 第3天:有关并行的两个重要定律
有关为什么要使用并行程序的问题前面已经进行了简单的探讨.总的来说,最重要的应该是处于两个目的. 第一,为了获得更好的性能: 第二,由于业务模型的需要,确实需要多个执行实体. 在这里,我将更加关注第一种 ...
- hibernate关联关系(多对多)
数据库的多对多数据库中不能直接映射多对多 处理:创建一个桥接表(中间表),将一个多对多关系转换成两个一对多 注:数据库多表联接查询 永远就是二个表的联接查询 注2:交叉连接 注3:外连接:left(左 ...
- java基础第十七篇之网络编程和装饰者模式
1:网络概述 1.1 网络的发展Net 1964年,美国人---> 阿帕网--->以太网Internet 1.2 网络的通信协议 windows电脑,android手机,Mac平板---& ...
- 通过JS屏蔽鼠标右键
我也是第一次接触这个功能,只需一行代码即可搞定,直译过来就是“屏蔽上下文菜单”,特此记录一下吧. document.oncontextmenu = () => false;
- Docker安装并运行mysql5.6数据库
1.在/home目录下新建mysql目录 mysql目录中新建三个目录:conf目录.logs目录.data目录,建这些目录的目的是用来挂载docker中的mysql下的目录的. 结果如下: 1.1. ...