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里的类 对象=属性+方法: 对象的属性主要是指主要的特征和参量,而方法主要是指函数: 类是一个具有一定特征和方法的集合,而对象是类的一个:类和对象的关系就如同模 ...
随机推荐
- Gson的序列化和反序列化-待更新
反序列化为List List<Person> persons =gson.fromJson(json, new TypeToken<List<Person>>() ...
- WPF 字体设置
原文:WPF 字体设置 WPF 主界面 更换字体 可全局 但是有的时候有的窗体 字体还是没变 可以做全局样式 <Window x:Class="CLeopardTestWpf.Main ...
- A bean with that name has already been defined in class path resource [org/springframework/transaction/annotation/ProxyTransactionManagementConfiguration.class] and overriding is disabled
2019-12-19 13:26:17.594 WARN [main] o.s.boot.web.servlet.context.AnnotationConfigServletWebServerApp ...
- 序列化禁止使用Optional
1: 概论 Optional 是Java8用来改变java引发NPE的解决办法,但是不是绝对的解决办法 2: 例子: 很多博文一上来就给力以下使用例子 @Data public class User ...
- pytest框架之fixture前置和后置
一.conftest.py 定义公共的fixture,多个测试类中都可以调用 pytest提供了conftest.py文件,可以将fixture定义在此文件中 运行测试用例时,不需要去导入这个文件,会 ...
- Spring Boot 启动以后然后再加载缓存数据 CommandLineRunner
实际应用中,我们会有在项目服务启动完成以后去加载一些数据或做一些事情(比如缓存)这样的需求. 为了解决这样的问题,Spring Boot 为我们提供了一个方法,通过实现接口 CommandLineRu ...
- C#上手练习7(构造方法语句)
创建类的对象是使用“类名 对象名 = new 类名()”的方式来实现的. 实际上,“类名()”的形式调用的是类的构造方法,也就是说构造方法的名字是与类的名称相同的. 构造方法的定义语法形式如下. 访问 ...
- go-goroutine 和 channel
goroutine 和 channel goroutine-看一个需求 需求:要求统计 1-9000000000 的数字中,哪些是素数? 分析思路: 1) 传统的方法,就是使用一个循环,循环的判断各个 ...
- css布局技巧
CSS用户界面样式 鼠标样式currsor li{ cursor:pointer: } 设置或检索在对象上移动鼠标指针采用何种系统预定义的光标形状 属性值 描述 default 默认 pointer ...
- Oracle第二话之调优工具
Oracle第二话之调优工具 原创if 0 = -I can 发布于2019-04-09 19:53:12 阅读数 172 收藏 展开 目录 1.告警日志 2.用户进程trace文件 3.动态性能视 ...