前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Python类的空间问题以及类之间的关系

Python类的空间问题以及类之间的关系

作者头像
星陨1357
发布于 2023-03-14 08:33:25
发布于 2023-03-14 08:33:25
80200
代码可运行
举报
运行总次数:0
代码可运行

类的空间问题

添加对象属性

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class A:
    def __init__(self,name):
        self.name = name

    def func(self,sex):
        self.sex = sex

在类外部添加(在类的外部通过万能的点进行类的属性的添加)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class A:
    def __init__(self,name):
        self.name = name

    def func(self,sex):
        self.sex = sexa

obj = A('chensong')
obj.age = 18
print(obj.__dict__)

类的内部添加(引用内部的方法,在类的内部添加属性)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class A:
    def __init__(self,name):
        self.name = name

    def func(self,sex):
        self.sex = sex

obj = A('chensong')
obj.func('男')
print(obj.__dict__)

总结:对象的属性不仅可以在init里面添加,还可以在类的其他方法或者类的外面添加。

添加类的属性

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class A:
    def __init__(self,name):
        self.name = name

    def func(self,sex):
        self.sex = sex

    def func1(self):
        A.bbb = self
        
A.aaa = 'test' # 类的外部添加(使用点进行添加)
print(A.__dict__)

A.func1('123') # 类的内部添加(使用类内部的方法进行在内部进行添加)
print(A.__dict__)

总结:类的属性不仅可以在类内部添加,还可以在类的外部添加

对象如何找到类的属性

对象空间

  1. 产生这个对象空间,并有一个类对象指针
  2. 执行 init 方法,给对象封装属性

对象查找属性的顺序:先从对象空间找 ------> 类空间找 ------> 父类空间找 ------->.....

类名查找属性的顺序:先从本类空间找 -------> 父类空间找--------> ........

上面的顺序都是单向不可逆,类名不可能找到对象的属性。

类与类之间的关系

类与类中存在以下关系:

  1. 依赖关系
  2. 关联关系
  3. 组合关系
  4. 聚合关系
  5. 实现关系
  6. 继承关系(类的三大特性之一:继承。)

依赖关系

例:将大象装进冰箱,需要两个类, ⼀个是⼤象类, ⼀个是冰箱类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Elphant:
    def __init__(self,name):
        self.name = name
        
    def open(self):
        '''
        开门
        '''
        pass
        
    def close(self):
        '''
        关门
        '''
        pass
        
class Refrigerator:
    def open_door(self):
        print('冰箱门打开了')
        
def close_door(self):
    print('冰箱门关上了')

将大象类和冰箱类进行依赖

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Elphant:
    def __init__(self,name):
        self.name = name
        
    def open(self,obj1):
        '''
        开门
        '''
        print(self.name,'要开门了')
        obj1.open_door()
        
    def close(self):
        '''
        关门
        '''
        pass
        
class Refrigerator:
    def open_door(self):
        print(f'{self.name}冰箱门打开了')
        
def close_door(self):
    print(f'{self.name}冰箱门关上了')

elphant1 = Elphant('大象')        
haier = Refrigerator('海尔')
elphant1.open(haier)

关联,聚合,组合关系

其实这三个在代码上写法是⼀样的. 但是, 从含义上是不⼀样的

  1. 关联关系. 两种事物必须是互相关联的. 但是在某些特殊情况下是可以更改和更换的
  2. 聚合关系. 属于关联关系中的⼀种特例. 侧重点是xxx和xxx聚合成xxx. 各⾃有各⾃的声明周期. 比如电脑. 电脑⾥有CPU, 硬盘, 内存等等. 电脑挂了. CPU还是好的. 还是完整的个体
  3. 组合关系. 属于关联关系中的⼀种特例. 写法上差不多. 组合关系比聚合还要紧密. 比如⼈的⼤脑, ⼼脏, 各个器官. 这些器官组合成⼀个⼈. 这时. ⼈如果挂了. 其他的东⻄也跟着挂了

关联关系

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Boy:
    def __init__(self,name,girlFirend=None):
        self.name = name
        self.girlFriend = girlFirend

    def have_a_dinner(self):
         if self.girlFriend:
            print('%s 和 %s 一起晚饭'%(self.name,self.girlFriend.name))
        else:
            print('单身狗,吃什么饭')
        
class Girl:
    def __init__(self,name):
        self.name = name
        
b = Boy('日天')
b.have_a_dinner()

b.girlFriend = Girl('如花')
b.have_a_dinner()

gg = Girl('花花')
bb = Boy('songsong',gg)
bb.have_a_dinner()

注意. 此时Boy和Girl两个类之间就是关联关系. 两个类的对象紧密联系着. 其中⼀个没有了. 另⼀个就孤单 的不得了. 关联关系, 其实就是 我需要你. 你也属于我

学校和老师之间的关系

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class School:

    def __init__(self,name,address):
        self.name = name
        self.address = address
        
class Teacher:

    def __init__(self,name,school):
        self.name = name
        self.school = school
        
s1 = School('北京校区','北京')
s2 = School('上海校区','上海')
s3 = School('深圳校区','深圳')

t1 = Teacher('T1',s1)
t2 = Teacher('T2',s2)
t3 = Teacher('T3',s3)

print(t1.school.name)
print(t2.school.name)
print(t3.school.name)

但是学校也是依赖于老师的,所以老师学校应该互相依赖。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class School:
    
    def __init__(self,name,address):
        self.name = name
        self.address = address
        self.teacher_list = []
    def append_teacher(self,teacher):
        self.teacher_list.append(teacher)
        
        
class Teacher:
    def __init__(self,name,school):
        self.name = name
        self.school = school
        
s1 = School('北京校区','北京')
s2 = School('上海校区','上海')
s3 = School('深圳校区','深圳')

t1 = Teacher('T1',s1)
t2 = Teacher('T2',s2)
t3 = Teacher('T3',s3)

s1.append_teacher(t1.name)
s1.append_teacher(t2.name)
s1.append_teacher(t3.name)

print(s1.teacher_list)

组合:将一个类的对象封装到另一个类的对象的属性中,就叫组合

例:设计一个游戏,让游戏里面的人物互殴

加上一个武器类,让人使用武器攻击

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Gamerole:
    def __init__(self,name,ad,hp,wea=None):
        self.name = name
        self.ad = ad
        self.hp = hp
        self.wea = wea
        
    def attack(self,p1):
        p1.hp -= self.ad
        print('%s攻击%s,%s掉了%s血,还剩%s'%(self.name,p1.name,p1.name,self.ad,p1.hp))
        
        def equip_weapon(self,wea):
            self.wea = wea
            wea.ad += self.ad
            wea.owner_name = self.name
            
class Weapon:
    def __init__(self,name,ad,owner_name = None):
        self.name = name
        self.owner_name = owner_name
        self.ad = ad
    def weapon_attack(self,p2):
        p2.hp = p2.hp - self.ad
        print('%s利用%s攻击了%s,%s还剩%s血(self.owner_name,self.name,p2.name,p2.name,p2.hp))
        
man = Gamerole('人',10,100)
dog = Gamerole('狗',50,100)
stick = Weapon('木棍',40)
              
man.equip_weapon(stick)
stick.weapon_attack(dog)
# 人利用木棍攻击了狗,狗还剩50

案例,循环回合制游戏

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import time
import random
class Gamerole:
    def __init__(self, name, ad, hp, wea=None):
        self.name = name
        self.ad = ad
        self.hp = hp
        self.wea = wea
        
    def attack(self, p1):
        p1.hp -= self.ad
        print('%s攻击%s,%s掉了%s血,还剩%s' % (self.name, p1.name, p1.name,self.ad, p1.hp))
    
    def equip_weapon(self, wea):
        self.wea = wea
        wea.ad += self.ad
        wea.owner_name = self.name

    class Weapon:
        def __init__(self,name,ad,owner_name = None):
            self.name = name
            self.owner_name = owner_name
            self.ad = ad
        def weapon_attack(self,p2):
            p2.hp = p2.hp - self.ad
            print('%s利用%s攻击了%s,%s还剩%s血'%(self.owner_name,self.name,p2.name,p2.name,p2.hp))
sunwukong = Gamerole("孙悟空", 30, 500)
caocao = Gamerole("曹操", 60, 100)
anqila = Gamerole("安琪拉", 80, 80)

baigujing = Gamerole("白骨精", 35, 450)
guanyu = Gamerole("关羽", 40, 200)
diaochan = Gamerole("貂蝉", 50, 150)

dongxie_list = [sunwukong, caocao, anqila]xidu_list = [baigujing, guanyu, diaochan]

if __name__ == '__main__':
    print("游戏开始加载")
    # 打印一个菜单
    for i in range(0, 101, 2):
        time.sleep(0.1)
        char_num = i // 2
        per_str = '\r%s%% : %s' % (i, '*' * char_num)
        print(per_str, end='')
    print('')
    info = input("游戏加载完毕,输入任意字符开始!")
    # 输出东邪吸毒阵营里的任务角色
    print("东邪阵营".center(20, '*'))
    for i in dongxie_list:
        print(i.name.center(20))
    print("西毒阵营".center(20, '*'))
    for i in xidu_list:
        print(i.name.center(20))
        
    while True:
    # 判断游戏结束的条件是某一方全部阵亡
        if len(dongxie_list) == 0:
        print("西毒阵营胜利!!!")
            break
        if len(xidu_list) == 0:
            print("东邪阵营胜利!")
            break

         # 游戏逻辑,每次随机选择一名角色出击
         index1 = random.randint(0, len(dongxie_list) - 1)
         index2 = random.randint(0, len(xidu_list) - 1)

        # 开始攻击
        time.sleep(0.5)
        role1 = dongxie_list[index1]
        time.sleep(0.5)
        role2 = xidu_list[index2]
        time.sleep(0.5)
        role1.attack(role2)
        role2.attack(role1)

        # 判断是否有英雄阵亡
        if role1.hp <= 0:
            print("%s阵亡!" % role1.name)
            dongxie_list.remove(role1)
        if role2.hp <= 0:
            print("%s阵亡!" % role2.name)
            xidu_list.remove(role2)
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
呜呜祖啦滤波器FPGA实现
大侠好,欢迎来到FPGA技术江湖,江湖偌大,相见即是缘分。大侠可以关注FPGA技术江湖,在“闯荡江湖”、"行侠仗义"栏里获取其他感兴趣的资源,或者一起煮酒言欢。
FPGA技术江湖
2020/12/29
7690
呜呜祖啦滤波器FPGA实现
基于FPGA的均值滤波(三)
基于FPGA的均值滤波(三) 之二维求和模块 在实现了窗口内一维行方向上的求和操作,现在要得到整个窗口内的像素之和,还必须将每一行的计算结果再叠加起来。但是每一行的计算结果就不可以使用上面的增量更新的
瓜大三哥
2018/02/26
9620
基于FPGA的均值滤波(三)
荐读:FPGA设计经验之图像处理
大侠好,欢迎来到FPGA技术江湖,江湖偌大,相见即是缘分。大侠可以关注FPGA技术江湖,在“闯荡江湖”、"行侠仗义"栏里获取其他感兴趣的资源,或者一起煮酒言欢。
FPGA技术江湖
2020/12/29
1.4K0
荐读:FPGA设计经验之图像处理
有趣的算法(十一) ——分治法:快速​求最值
有趣的算法(十一)——分治法:快速求最值 (原创内容,转载请注明来源,谢谢) 一、需求 一个数组,里面有若干的数字,现需要得到这一组数字的最大值和最小值。 二、简单分析 最基本的做法,是两两比对,可以区分出临时的最大值和最小值,再拿临时的最大值和最小值往后比较,有新的最值则更新。总的需要的比较次数是2n-2。 三、优化 使用分治法快速求最值。即把数组分到最小的1-2个数,两两比较后,仅将最大值和最小值回传,再两两比较最值,回传新的最值,最终得出最大值和最小值。 分析需要比较的次数。当数组只有1个数时,
用户1327360
2018/03/07
1.7K0
leetcode-747-Largest Number At Least Twice of Others(求vector的最大值和次大值)
题目描述: In a given integer array nums, there is always exactly one largest element. Find whether the largest element in the array is at least twice as much as every other number in the array. If it is, return the index of the largest element, otherwise retur
chenjx85
2018/05/21
6980
基于FPGA灰度图像的形态学腐蚀
数学形态学是一门建立在集论基础上的学科,是几何形态学分析和描述的有力工具。数学形态学的蓬勃发展,其并行快速,易于硬件实现,目前已经在计算机视觉、信号处理与图像分析、模式识别等方面得到了极为广泛的应用。
FPGA开源工作室
2019/10/29
9190
基于FPGA灰度图像的形态学腐蚀
形态学滤波(五)
形态学滤波(五) 之一维形态学腐蚀/膨胀子模块设计 对于图像处理而言,是纵向和横向两个维度的处理。我们知道,对于任何二维的操作,都可以分解为一维方向的操作来简化来设计。在图像处理中,习惯是首先横向处理,然后纵向处理。所谓横向处理就是对每一行进行处理。对于尺寸nxn的处理窗口可以采用一个1xn的窗体从图像第一行第一列开始,自左向右滑动,依次取出窗口内的n个限售股灰度值,比较得到灰度最小值或者最大值并按顺序存储。 以处理窗口尺寸为5说明,要完成5个数据的比较,可以在一个时钟完成两对数据的比较,第二个时钟完成上述
瓜大三哥
2018/02/26
6140
形态学滤波(五)
基于FPGA的均值滤波(二)
基于FPGA的均值滤波(二) 之一维求和模块 均值滤波按照整体设计可以分为以下几个子模块: (1)一维求和模块,这里记为sum_1D; (2)二维求和模块,这里记为sum_2D; (3)除法转换模块,此模块比较简单,一般情况下不进行模块封装。 (4)行缓存电路实现行列间像素对齐。 整个顶层模块调用sum_2D模块和除法转换电路求取平均值,记为mean_2D。 用FPGA来求和是最简单的事情,所要注意的是求和结果不要溢出。一般情况下,2个位宽为DW的数据想家,至少得用一个DW+1位宽的数据来存放。 假设窗口尺
瓜大三哥
2018/02/26
1.5K0
基于FPGA的均值滤波(二)
基于FPGA的自动白平衡算法的实现(附代码)
对于白平衡基本概念的详细介绍请查看文章《白平衡初探》,白平衡算法主要的作用是将偏暖或者偏冷的色调自动恢复到正常色调,是图像看起来更加色彩饱满正常。
FPGA技术江湖
2021/04/07
2K0
基于FPGA的自动白平衡算法的实现(附代码)
图像分割(五)
图像分割(五) 之基于FPGA的局部自适应分割 子模块设计 数据累加模块add_tree 数据累加模块负责将窗口内所有元素与均值之差的平方相加,这里还是采用以前的加法思路:每个加法器限制两个输入,这样
瓜大三哥
2018/02/26
6620
图像分割(五)
基于FPGA的非线性滤波器(三)
基于FPGA的非线性滤波器(三) 之并行全比较排序模块设计 由于排序运算在图像的行列方向上是同性的,因此,同时考虑首先进行一维图像方向上的排序,再对列方向上的行排序结果进行排序,即可得到一个窗口内的排序结果。 一维方向的排序运算模块,记为sort_1d。同样地,对于最终的二维排序运算模块,记为sort_2d。 1.sort_1d模块设计 计算步骤如下: (1)首先得到待排序的n个数据:这可以通过将数据流打n-1拍实现。 (2)进行全比较:当前数据与其他所有一次进行比较,并记录比较结果,比较的过程需先考虑输入
瓜大三哥
2018/02/26
7450
基于FPGA的非线性滤波器(三)
基于FPGA的直方图拉伸
在视频处理中,为了能够实时调节图像的对比对,通常需要对直方图进行拉伸处理。直方图拉伸是指将图像灰度直方图较窄的灰度级区间向两端拉伸,增强整幅图像像素的灰度级对比度,达到增强图像的效果。
FPGA开源工作室
2019/12/18
1.2K0
形态学滤波(六)
形态学滤波(六) 之二维形态学腐蚀/膨胀子模块设计 按照二维扩展的思路,将每一行的一维算子的计算结果对齐在列方向上再进行一维运算,得到的结果即是二维运算结果。 上面的结构图中涉及到: (1)minma
瓜大三哥
2018/02/26
7300
形态学滤波(六)
题解 | Verilog刷题解析及对应笔试面试注意点【6-9】(涉及==和===、for展开问题等)
目的:不仅仅是解题,更多的是想从真实的FPGA和数字IC实习秋招和实际工程应用角度,解读一些【笔试面试】所注意的知识点,做了一些扩展。
FPGA探索者
2022/05/26
1.3K0
题解 | Verilog刷题解析及对应笔试面试注意点【6-9】(涉及==和===、for展开问题等)
谁能想到,求最值的算法还能优化?
今天主要来聊两个问题:给一个数组,如何同时求出最大值和最小值,如何同时求出最大值和第二大值?
labuladong
2021/09/23
8650
LeetCode 第 18 场双周赛(188/587,前32%)
题目链接 给你一个整数数组 arr ,请你将数组中的每个元素替换为它们排序后的序号。
Michael阿明
2020/07/13
7590
LeetCode 第 18 场双周赛(188/587,前32%)
求最大最小值,最少要进行多少次比较? | 经典面试题
(3)两个子数组的最大值里再取最大值,两个子数组的最小值里再取最小值,就是最终解;
架构师之路
2021/11/10
9580
图像分割(四)
图像分割(四) 之基于FPGA的局部自适应分割 子模块设计 窗口缓存模块win_buf 本模块不做任何算法上的处理,只是负责将当前输入像素的二维窗口元素缓存并组成一个一维的向量输出。 模块的构建非常简
瓜大三哥
2018/02/26
8660
图像分割(四)
Greedy & Violent
1 2 3//坐标缩小后就可以更方便的选择 double pos = (double)i / n * (n + m);//原来雕像的位置 ans += fabs(pos - floor(pos + 0.5))/(n + m);//*n+m后就选四舍五入最近的
radaren
2018/08/28
5580
影响FPGA时序的进位链(Carry Chain), 你用对了么??
在FPGA中我们写的最多的逻辑是什么?相信对大部分朋友来说应该都是计数器,从最初板卡的测试时我们会闪烁LED,到复杂的AXI总线中产生地址或者last等信号,都会用到计数器,使用计数器那必然会用到进位链。
猫叔Rex
2020/06/29
2.1K0
推荐阅读
相关推荐
呜呜祖啦滤波器FPGA实现
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档