python面向对象之 类的关系
内容梗概:
1. 依赖关系
2. 关联关系, 组合关系, 聚合关系
3. 继承关系, self到底是什什么鬼?
4. 类中的特殊成员 1. 依赖关系
def:在方法中给方法传递一个对象. 此时类与类之间的关系是最轻的,
我⽤用着你. 但是你不属于我. 这种关系是最弱的.比如临时工. 详见实例:
class JiangShi():
def __init__(self,name,HP):
self.name = name
self.HP = HP
def beida(self): #方法中给方法传递一个对象
print("我是僵尸%s,我被暴打了一顿"%(self.name)) class ZhiWu():
def __init__(self,name,power,jineng):
self.name = name
self.power = power
self.jineng = jineng
def attack(self,el):
print("我是植物%s,我刚刚用%s攻击了僵尸%s"%(self.name,self.jineng,el.name ))
el.beida()
el.HP -= self.power
print("%s血量还剩下%s"%(el.name,el.HP)) zw = ZhiWu("小菊花",10,"无敌萌萌拳")
js = JiangShi("小可爱",1000)
zw.attack(js)
zw.attack(js) 2. 关联关系, 组合关系, 聚合关系
定义:
1. 关联关系. 两种事物必须是互相关联的. 但是在某些特殊情况下是可以更更改和更更换的.
2. 聚合关系. 属于关联关系中的一种特例例. 侧重点是xxx和xxx聚合成xxx. 各⾃有各⾃的声明周期.
比如电脑. 电脑里里有CPU, 硬盘, 内存等等. 电脑挂了了. CPU还是好的. 还是完整的个体
3. 组合关系. 属于关联关系中的一种特例.写法上差不多.组合关系比聚合还要紧密.比如人的大脑,心脏,各个器官.
这些器官组合成⼀个人. 这时. 人如果挂了了. 其他的东⻄也跟着挂了.
实例1:男女朋友
class Boy():
def __init__(self,name,girlfriend=None):
self.name = name
self.girlfriend = girlfriend
def chi(self):
if self.girlfriend:
print("%s和%s在街边吃麻辣烫"%(self.name,self.girlfriend.name))
else:
print("单身狗自己在家抠脚就好")
class Girl:
def __init__(self,name):
self.name = name
b1 = Boy("小鲜肉")
g1 = Girl("小白菜")
b1.girlfriend = g1
b1.chi()
b1.girlfriend = None
b1.chi() 实例2:老师和学生
class Teacher():
def __init__(self,name,student_list = None):
self.name = name
if student_list == None:
self.student_list = []
else:
self.student_list = student_list def add(self,stu):
self.student_list.append(stu) def show(self):
for el in self.student_list:
print(el.name) class Student():
def __init__(self,num,name):
self.name = name
self.num = num s1 = Student(1,"宋小宝")
s2 = Student(2,"赵四")
s3 = Student(3,"刘能")
s4 = Student(4,"小沈阳")
t1 = Teacher("赵本山",[s1,s2])
t1.add(s3)
t1.add(s4)
t1.show() 3.继承关系, self到底是什什么鬼?
定义:继承
在⾯面向对象的世界中存在着继承关系. 我们现实中也存在着这样的关系. 我们说过. x是⼀种y, 那x就可以继承y.
这时理解层⾯面上的.如果上升到代码层⾯.我们可以这样认为.子类在不影响父类的程序运行的基础上对父类进行的扩充和扩展.
这里.我们可以把父类被称为超类或者基类. 子类被称为派生类. 3.1注意tips:
首先, 类和对象默认都是可哈希的 class Foo:
def __init__(self):
pass
def method(self):
pass
__hash__ = None
print(hash(Foo))
print(hash(Foo()))
既然可以hash. 那就是说字典的key可以是对象或者类 3.2 self.
记住. 不管方法之间如何进行调用. 类与类之间是何关系. 默认的self都是访问这个方法的对象.
实例一:
class Base:
def __init__(self, num):
self.num = num
def func1(self):
print(self.num)
self.func2()
def func2(self):
print(111, self.num)
class Foo(Base):
def func2(self):
print(222, self.num)
lst = [Base(1), Base(2), Foo(3)]
for obj in lst:
obj.func1() #做完这个基本就会了
总结:
1.self在访问方法的顺序: 永远先找⾃己的. ⾃己的找不到再找父类的
2.不管方法之间如何进行调用. 类与类之间是何关系, 默认的self都是访问这个方法的对象 4. 类中的特殊成员
4.1 列举特殊成员
__init__() ,当构建生成对象时自动调用
__getitem__() ,当调用索引类操作的时候会自动调用 对象[索引]
__setitem__() ,当创建字典时会自动调用 对象[key] = values
__delitem__() ,当删除字典,自动调用 del 对象[key]
__enter__(),__exit__() ,当使用文件操作, with 对象 as 变量, 的时候进入和退出时自动调用
__call__() ,调用方法或函数时,对象()
__add__() ,有加法的时候会自动调用 +
__str__() ,当打印输出的时候,会自动调用(平民输出)
__repr__() ,当打印输出的时候,会自动调用(官方输出)
__hash__ == None ,此方法可是对象不可哈希
__len__() ,当调用查询对象长度时 len(对象)
__dir__() 当查询对象方法时自动调用 dir(对象)
__iter__() 对可迭代对象进行迭代会自动调用. 如for 变量 in 可迭代对象
__bool__() 点用布尔值的时候 bool(对象) 创建对象的真正步骤:
首先, 在执行类名()的时候. 系统会⾃动先执行__new__()来开辟内存. 此时新开辟出来的内存区域是空的.
紧随其后, 系统⾃动调用__init__()来完成对象的初始化工作. 按照时间轴来算.
1. 加载类
2. 开辟内存(__new__)
3. 初始化(__init__)
4. 使用对象⼲干xxxxxxxxx 实例1:
class Car:
def __init__(self, color, pai): # 初始化方法
print("哪有地呀")
self.color = color
self.pai = pai # 这里才是真正的构造方法
def __new__(cls, *args, **kwargs):
print("我的天哪")
# 固定的返回值
return object.__new__(cls) c = Car("红色", "京A66666") # 先执行__new__ 返回object.__new__(cls).把返回的空对象传递给 __init__() print(c.color)
python面向对象之 类的关系的更多相关文章
- Python面向对象02/类的空间问题、类与对象之间的关系、类与类之间的关系
Python面向对象02/类的空间问题.类与对象之间的关系.类与类之间的关系 目录 Python面向对象02/类的空间问题.类与对象之间的关系.类与类之间的关系 1. 类的空间问题 2. 类与对象之间 ...
- python 面向对象与类的基本知识
一 什么是面向对象,面向对象与类的关系. 面向对象的程序设计是用来解决扩展性. 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象 ...
- Python 面向对象之一 类与属性
Python 面向对象之 类与属性 今天接触了一下面向对象,发现面向对象和之前理解的简直就是天壤之别,在学Linux的时候,一切皆文件,现在学面向对象了,so,一切皆对象. 之前不是一直在学的用面向函 ...
- python 面向对象和类成员和异常处理
python 面向对象 你把自己想象成一个上帝,你要创造一个星球,首先你要把它揉成一个个球,两个直径就能创造一个球 class star: '''名字(name),赤道直径(equatorial di ...
- python面向对象(二)——类成员
Python面向对象 类成员 1.字段 普通字段 属于对象 静态字段 属于类 2.方法 普通方法 触发者是对象 括号里至少一个参数 se ...
- python 面向对象(类)--学习笔记
面向对象是一种编程方式, 主要集中在类和对象的两个概念 python 中的类符合封装, 继承, 多态的特征 类 是一个模板, 是n多函数的集成 对象 是类的实例化 类的成员分为三大类:字段.方法.属性 ...
- python 面向对象(三)类与类之间的关系 初始化方法一些类
###################总结################# 面试的时候 让写python一些特殊方法 __init__ 创建对象的时候初始化 __new__对象实例化调用第一个方法 ...
- Python 面向对象基础(类、实例、方法、属性封装)
python是面向对象语言,一切皆对象. 面向过程: 变量和函数. “散落” 在文件的各个位置,甚至是不同文件中.看不出变量与函数的相关性,非常不利于维护,设计模式不清晰. 经常导致程序员,忘记某个变 ...
- python面向对象、类、socket网络编程
类和对象 python3统一了类与类型的概念:类==类型:从一组对象中提取相似的部分就是类:特征与技能的结合体就叫做对象: 类的功能: 初始实例化: 属性引用: 1.数据属性: 2.函数属性: 对于一 ...
随机推荐
- 12.27 cf div3 解题报告
12.27 cf div3 解题报告 wxy.wxy,带上分拉,全场做了个无脑小白 比赛场地 A: T1,跟着模拟就好了 B: sort一遍之后 去除的数一定是a[1]或者a[n] 比较去除谁小就输出 ...
- windows下使用gvim不支持python3.6问题解决
在用户目录下C:\Users\Administrator\新建vim配置文件夹vimfiles,然后该文件下建立一个文件vimrc vimrc内容: set pythonthreedll=python ...
- Read.csv: some rows are missing
read.csv in R doesn't import all rows from csv file The OP indicates that the problem is caused by q ...
- (zhuan) Where can I start with Deep Learning?
Where can I start with Deep Learning? By Rotek Song, Deep Reinforcement Learning/Robotics/Computer V ...
- [蓝桥] 算法训练 P0505
时间限制:1.0s 内存限制:256.0MB 一个整数n的阶乘可以写成n!,它表示从1到n这n个整数的乘积.阶乘的增长速度非常快,例如,13!就已经比较大了,已经无法存放在一个整型变量中:而35!就更 ...
- Shiro学习笔记四(Shiro集成WEB)
这两天由于家里出了点事情,没有准时的进行学习.今天补上之前的笔记 -----没有学不会的技术,只有不停找借口的人 学习到的知识点: 1.Shiro 集成WEB 2.基于角色的权限控制 3.基于权限的控 ...
- AtomicReference实现单例模式
CAS是项乐观锁技术,当多个线程尝试使用CAS同时更新同一个变量时,只有其中一个线程能更新变量的值,而其它线程都失败,失败的线程并不会被挂起,而是被告知这次竞争中失败,并可以再次尝试. 乐观锁的一种实 ...
- SAP-批量修改主数据(客户、供应商、物料)
SAP-批量修改主数据(客户.供应商.物料) TCODE: MASS 对于批量修改主数据如客户,供应商等,可以试用一下Mass , 它所能修改的范围如下: 选定要修改的对象后,点击运行,会要求选择需要 ...
- springboot整合thymeleaf+tiles示例
网上关于此框架的配置实在不多,因此想记录下来以防忘记 因为公司框架基于上述(公司采用gradle构建项目,楼主采用的是maven),所以楼主能少走些弯路: 1.创建springboot-maven项目 ...
- 【Mysql】【Navicat For Mac】Navicat Premium for Mac v12.0.23 + macOS Sierra 10.12.6
参考地址:https://blog.csdn.net/womeng2009/article/details/79700667 [备注]我只用到了部分信息,就激活了 内容: Navicat Premiu ...