内容梗概:
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面向对象之 类的关系的更多相关文章

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

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

  2. python 面向对象与类的基本知识

    一  什么是面向对象,面向对象与类的关系. 面向对象的程序设计是用来解决扩展性. 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象 ...

  3. Python 面向对象之一 类与属性

    Python 面向对象之 类与属性 今天接触了一下面向对象,发现面向对象和之前理解的简直就是天壤之别,在学Linux的时候,一切皆文件,现在学面向对象了,so,一切皆对象. 之前不是一直在学的用面向函 ...

  4. python 面向对象和类成员和异常处理

    python 面向对象 你把自己想象成一个上帝,你要创造一个星球,首先你要把它揉成一个个球,两个直径就能创造一个球 class star: '''名字(name),赤道直径(equatorial di ...

  5. python面向对象(二)——类成员

    Python面向对象    类成员 1.字段         普通字段    属于对象         静态字段    属于类   2.方法 普通方法   触发者是对象    括号里至少一个参数 se ...

  6. python 面向对象(类)--学习笔记

    面向对象是一种编程方式, 主要集中在类和对象的两个概念 python 中的类符合封装, 继承, 多态的特征 类 是一个模板, 是n多函数的集成 对象 是类的实例化 类的成员分为三大类:字段.方法.属性 ...

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

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

  8. Python 面向对象基础(类、实例、方法、属性封装)

    python是面向对象语言,一切皆对象. 面向过程: 变量和函数. “散落” 在文件的各个位置,甚至是不同文件中.看不出变量与函数的相关性,非常不利于维护,设计模式不清晰. 经常导致程序员,忘记某个变 ...

  9. python面向对象、类、socket网络编程

    类和对象 python3统一了类与类型的概念:类==类型:从一组对象中提取相似的部分就是类:特征与技能的结合体就叫做对象: 类的功能: 初始实例化: 属性引用: 1.数据属性: 2.函数属性: 对于一 ...

随机推荐

  1. How to search for ? (question mark) in Excel

    The ? is a wildcard which represents a single character, and the * is a wildcard character that repr ...

  2. (zhuan) Evolution Strategies as a Scalable Alternative to Reinforcement Learning

    Evolution Strategies as a Scalable Alternative to Reinforcement Learning this blog from: https://blo ...

  3. 所有JTAG集成电路都应该支持菊花链

    菊花链 在电气和电子工程中,菊花链是一种布线方案,其中多个设备按顺序或环形连接在一起.相邻设备才能通信.菊花链可用于电源,模拟信号,数字数据或其组合. 但是由于菊花链的串联特性,如果任何一个设备从链路 ...

  4. Qt打包

    先在Qt Creator里release一遍,打开Qt下载时自带的像命令控制台一样的东西,比如我在创建项目时选用的是MinGw编译器, 然后在文件管理器里找到release生成的exe,cd进exe所 ...

  5. 1、My Scripts

    1.写一个包含命令.变量和流程控制的语句来清除/var/log的messages日志文件的shell脚本.(P26)(11-21) 2.利用$0和(dirname.basename)取出当前路径的目录 ...

  6. 常用markdown语法入门

    入门markdown常用基本语法,简单到让你怀疑人生~~ 不说废话,直接上图(如果图片显示不清晰,建议选中图片右键——在新标签页中打开图片,妥妥的呢!!) (左侧黑色背景为markdown语法,右侧为 ...

  7. mail命令

    mail命令是命令行的电子邮件发送和接收工具.操作的界面不像elm或pine那么容易使用,但功能非常完整. 语法 mail(选项)(参数) 选项 -b<地址>:指定密件副本的收信人地址: ...

  8. Spring Boot的数据访问 之Spring Boot + jpa的demo

    1. 快速地创建一个项目,pom中选择如下 <?xml version="1.0" encoding="UTF-8"?> <project x ...

  9. php格式化数字输出number_format

    <?php $num = 4999.944444; $formattedNum = number_format($num).PHP_EOL; echo $formattedNum; $forma ...

  10. eclipse中启动 Eclipse 弹出“Failed to load the JNI shared library jvm.dll”错误

    原因1:给定目录下jvm.dll不存在. 对策:(1)重新安装jre或者jdk并配置好环境变量.(2)copy一个jvm.dll放在该目录下. 原因2:eclipse的版本与jre或者jdk版本不一致 ...