1.依赖关系

类与类之间存在这几种关系:1.依赖关系 2.关联关系 3.组合关系 4.聚合关系 5.继承关系 6.实现关系

我们来设置下面两个场景 玩电脑和打僵尸

class Person:
def play(self, tools): # 通过参数的传递把另外一个类的对象传递进来
tools.run()
print("很开心, 我能玩儿游戏了") class Computer:
def run(self):
print("电脑开机. 可以运行") class Phone:
def run(self):
print("手机开机, 可以运行") c = Computer()
phone = Phone() p = Person()
p.play(phone) # 写一个植物大战僵尸
# 1. 植物
# 打僵尸. 僵尸掉血
# 2. 僵尸
# 吃植物. 植物掉血 class Plant:
def __init__(self, name, hp, ad): # 200
self.name = name
self.hp = hp
self.ad = ad def attack(self, js):
print("植物攻击僵尸")
js.hp -= self.ad
print(f"僵尸掉血{self.ad}, 还剩下{js.hp}") class JiangShi:
def __init__(self, name, hp, ad): # 1000 800
self.name = name
self.hp = hp
self.ad = ad def attack(self, zw):
print("僵尸咬植物")
zw.hp -= self.ad
print(f"植物掉血{self.ad}, 还剩{zw.hp}") # 植物
wd = Plant("歪脖子豌豆", 10, 20)
# 僵尸
js = JiangShi("铁桶僵尸", 200, 1)
wd.attack(js)
wd.attack(js)
wd.attack(js)
wd.attack(js)
wd.attack(js) js.attack(wd)
js.attack(wd)
js.attack(wd)
js.attack(wd)

  

2.关联关系,组合关系,聚合关系

这三个在代码上写法是一样的,但是,从含义上是不一样的

1.关联关系:两种事物必须是互相关联的.但是在某种情况下是可以更改和更换的

2.聚合关系.属于关联关系中的一种特例.侧重点是xxx和xxx聚合成xxx.各自有各自的声明周期.比如电脑,电脑有cpu,硬盘,内存等等.电脑坏了,cpu还是好的,还是完整的个体.

3.组合关系.属于关联关系中的一中特例.写法上差不多.组合关系比聚合还要紧密,比如人的大脑,心脏,各个器官,这个器官组合成一个人.这是人如果挂了.其他的东西也就失效了

我们举个例子,男人关联着女朋友,女人关联着男朋友.这种关系可以是互相的

class Boy:

    def __init__(self, name,  girlFriend=None):
# 在初始化的时候可以给一个对象的属性设置成另一个类的对象
self.girlFriend = girlFriend # 一个男孩有一个女朋友 def chi(self):
if self.girlFriend:
print(f"带着他的女朋友{self.girlFriend.name}去吃饭")
else:
print("单身狗, 吃什么吃? 滚去学习.") def movie(self):
if self.girlFriend:
print(f"带着他的女朋友{self.girlFriend.name}去看电影")
else:
print("单身狗, 看什么看? 滚去学习.") class Girl:
def __init__(self, name):
self.name = name b = Boy("小明")
g = Girl("小红")
b.chi() # 给小名介绍一个女朋友 小红
b.girlFriend = g
b.chi() g2 = Girl("小红")
b.girlFriend = g2 # 换了个女朋友
b.chi() class School: def __init__(self, name):
self.teach_list = [] # 这里要装多个老师
self.name = name def zhaopin(self, teach):
self.teach_list.append(teach) def shangke(self):
for t in self.teach_list:
t.work() class Teacher:
def __init__(self, name):
self.name = name
def work(self):
print(f"{self.name}在上课") lnh = School("小学")
t1 = Teacher("王老师")
t2 = Teacher("赵老师")
t3 = Teacher("钱老师")
t4 = Teacher("孙老师")
t5 = Teacher("李老师")
t6 = Teacher("周老师") lnh.zhaopin(t1)
lnh.zhaopin(t2)
lnh.zhaopin(t3)
lnh.zhaopin(t4)
lnh.zhaopin(t5)
lnh.zhaopin(t6) lnh.shangke()

1.一对一关系 只有一个女朋友  2.一对多关系  一个学校,一堆老师

3.继承关系,self

self:谁调用的就是谁.类型是根据调用方的对象来进行变换的,self在访问方法的顺序,永远先找自己的.自己找不到再找父类的

super:表示的是父类

4.类中的特殊成员

__init__ :      构造函数,在生成对象时调用,类名()会自动执行
__del__ : 析构函数,释放对象时使用
__repr__ : 打印,转换为解释器读取的形式
__setitem__ : 按照索引赋值
__getitem__: 按照索引获取值
__len__: 获得长度
__cmp__: 比较运算,对象比较
__call__: 调用
__add__: 加运算
__sub__: 减运算
__mul__: 乘运算
__div__: 除运算
__mod__: 求余运算
__pow__: 幂
__call__ 对象()会自动执行
__getitem__ 对象[key]会自动执行
__setitem__ [key]=value会自动执行
__delitem__ del对象[key]会自动执行
__enter__ 和__exit__ with对象as变量会自动执行
__str__ 打印对象的时候会自动执行
__hash__ == None 对象就不可哈希了
__new__ 开辟内存
__iter__ iter(对象)

__init__()就是一个特殊的成员.这些方法在特殊的场景的时候会被自动执行

类名()会自动执行__init__()
def __init__(self): # 初始化操作
print("我是init, 我是老二")
print("初始化操作. 在创建对象的时候自动调用这个方法")

 def __new__(cls, *args, **kwargs): # 创建, 它是真正的构造方法, 可以开辟内存
     print("我是new. 我是老大")
          return object.__new__(cls)

 
对象()会自动执行__call__()
def __call__(self, *args, **kwargs):
print("我是对象()")
对象[key]会自动执行__getitem__()
 # 对象[]
def __getitem__(self, item):
print("item=",item)
print("你执行了__getitem__")
return "哈哈"
del 对象[key]会自动执行__delitem__()
del lst[1]
def __delitem__(self, key):
print("key=", key)
with对象as变量 会自动执行__enter__和__exit__
# with 对象:
def __enter__(self):
print("我是enter") # with 对象: 代码执行完毕. 最后执行这里
def __exit__(self, exc_type, exc_val, exc_tb):
print("我叫exit")
打印对象的时候会自动执行__str__
class Student:
def __init__(self, name, no, gender, cls, age):
self.name = name
self.no = no
self.gender = gender
self.cls = cls
self.age = age # 这个对象字符串的表示.
def __str__(self): # 返回该对象的字符串表示形式
return f"{self.name}, {self.no}, {self.gender}" def __repr__(self): # 该对象的官方的字符串表示形式
return f"{self.name}, {self.no}, {self.gender}" s = Student("小名", "3", "男", "三年二班", "31")
print(s)
干掉可哈希__hash__ == None 对象就不可哈希了

面向对象编程的执行流程 ->
1. 加载类 -> 给类创建一个名称空间 -> 主要存放类变量.
2. 创建对象 -> 先找类. -> 根据类来开辟内存 -> 执行类中的__new__() -> 执行__init__() -> 返回对象

python--类与类之间的关系,(魔术方法)特殊成员方法的更多相关文章

  1. Python面向对象02/类的空间问题、类与对象之间的关系、类与类之间的关系

    Python面向对象02/类的空间问题.类与对象之间的关系.类与类之间的关系 目录 Python面向对象02/类的空间问题.类与对象之间的关系.类与类之间的关系 1. 类的空间问题 2. 类与对象之间 ...

  2. python 面向对象专题(二):类的空间问题、类与对象之间的关系、类与类之间的关系

    https://www.cnblogs.com/liubing8/p/11308127.html 目录 Python面向对象02/类的空间问题.类与对象之间的关系.类与类之间的关系 1. 类的空间问题 ...

  3. PHP类和对象之间的关系

    类是对象的描述: 类和对象之间的关系类似于建房子的图纸和房子: 创建类--new对象--用对象: 一.对象的两个特性: --对象的行为(功能):可以对对象施加操作,例如,电视机的开.关.转换频道: - ...

  4. JAVA面向对象-----接口与类、接口之间的关系

    接口与类.接口之间的关系 大家之前都知道类与类之间的关系继承,那么接口与类之间又是怎样子的关系呢? 接口与类之间是实现关系.非抽象类实现接口时,必须把接口里面的所有方法实现.类实现接口用关键字impl ...

  5. UML图类,接口之间的关系

    UML图类之间的关系(来自大话设计模式中的一张图,代表了类,接口之间的各种关系)

  6. 关于PHP的加载类操作以及其他两种魔术方法应用

    <?php 加载类//include("./Ren.class.php");//include "./Ren.class.php";include_onc ...

  7. python 面向对象(三)类与类之间的关系 初始化方法一些类

    ###################总结################# 面试的时候 让写python一些特殊方法 __init__ 创建对象的时候初始化 __new__对象实例化调用第一个方法 ...

  8. Java 中判断类和实例之间的关系

    判断类与实例的关系有以下三种方式 1.instanceof关键字,用来判断对象是否是类的实例 (对象 => 类 )   2.isAssignableFrom,用来判断类型间是否存在派生关系 (类 ...

  9. 关于package,import,和“找不到可以加载的主类”报错之间的关系

    正在回顾java基础 目录结构如下: 一 以下代码,进入Example所在的文件夹, javac和java都不会报错 public class Example{ public static void ...

随机推荐

  1. C# 查找其他应用程序并打开、显示、隐藏、关闭

    软件开发中,有时迫不得已要用到第三方的软件,这时就涉及到在C#应用程序需要对第三方软件打开.显示.隐藏以及关闭. 下面列举了几个常用的方式 打开应用程序,下面是2种简单用法: 第一种: public ...

  2. leetcode814

    class Solution { public: TreeNode* pruneTree(TreeNode* root) { if(root==NULL) { return nullptr; } if ...

  3. LevelDB Log文件

    [LevelDB Log文件] log文件在LevelDb中的主要作用是系统故障恢复时,能够保证不会丢失数据.因为在将记录写入内存的Memtable之前,会先写入Log文件,这样即使系统发生故障,Me ...

  4. python's nonlocal

    [python's nonlocal] nonlocal是python3.x中新加的关键字,用于引用本作用域外层作用域的名字 参考:http://blog.csdn.net/chain2012/art ...

  5. 多产生半成品工单的问题 修改带SO的半成品工单无法分配给SO的问题的

    原因:验货及VIP带SO的半成品MO无法分配给对应的SO问题, 解决: SELECT SL.ENTERPRISE , SL.ENGINE_ID , SL.SITEID , ML.MO_ID || '_ ...

  6. 实例: Java代码操作oracle数据库(JDBC+sevrlet+jsp+html)

    1, 注册页面 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Strict//EN" "http://www.w3.or ...

  7. 在 macOS 中激活 Astash Professional

    Astah Professional v7.2.0-1ff236版安装完毕后,直接用压缩包内的 astah-pro.jar 替换原安装目录内的同名文件(/Applications/astah prof ...

  8. Gym 101201F Illumination (Two-Sat)

    题意:一个n*n的房子,有很多灯,每个格子只能被上下方向照一次.左右方向照一次,每个灯可以选择上下或是左右照,照明长度以自身位置为中心,占用2*r+1个格子.问能否安排一种方案,使所有格子满足条件. ...

  9. Git 客户端基本配置

    Welcome to Git (version -preview20140611) Run 'git help git' to display the help index. Run 'git hel ...

  10. Java 代理模式(二) Java中的动态代理

    动态代理类 Java动态代理类位于java.lang.reflect包下,一般主要涉及到以下两个类: 1.Interface InvocationHandler 该接口中仅定义了一个方法: Objec ...