一、从空间角度研究类

类外面可以给对象封装属性

class A:

	address = '美丽富饶的沙河'

	def __init__(self, name):
self.name = name
def func(self):
if self.name == 'dsb':
self.skins = '吉利服' obj = A('dsb')
# 类外面可以给对象封装属性
respons = input('太白帅不帅!')
if respons == '帅':
obj.weapon = 'AWM' print(obj.__dict__)

类内部封装属性

obj.func()
print(obj.__dict__) A.teamp = '39.5'
print(A.__dict__)
obj = A('dsb')
# A.func1(111)
A.func1(obj)
print(A.__dict__)

空间角度研究类

class Person:

    mind = '有思想'
language = '会使用语言' def __init__(self, name, age): self.name = name
self.age = age def work(self):
print('人类一般都需要工作') p1 = Person('dsb', 21)
del p1.mind # 报错
# print(p1.mind)
# p1.mind = '无脑'
# print(p1.mind)
# print(Person.mind)

注意: 对象无法改变类中的属性,对象只能查询或调用类里面的内容,但是不能改变,

类是一个公共区域,所有对象只能使用公共区域里面的东西,但是不能改变这些东西

类内部的各个对象是相互独立的(除去组合这种特殊的关系之外),各个对象之间是不能相互引用或者改变的,但是也可以产生关系:

对象取值顺序

对象如果想要查询一个属性: 对象空间>类空间>父类空间

类取值顺序

类查询一个对象: 类空间>父类空间

单向不可逆原则

二、类与类之间的关系

一般的关系不可能是一个

类与类之间是可以产生关系的

python中的三种关系:

1.依赖关系(主从关系)

# 大象自己进冰箱

# 大象类
class Elephant: def __init__(self, name):
self.name = name def open(self,ref1):
print('大象默念三声: 芝麻开门')
ref1.open_door()
def close(self):
print('大象默念三声: 芝麻关门') # 冰箱类
class Refrigerator: def __init__(self, name):
self.name = name def open_door(self):
print('冰箱门被打开了...') def closer_door(self):
print('冰箱门被关闭了...') ele = Elephant('齐齐')
ref = Refrigerator('美菱')
ele.open(ref) # 这一步是关键,将ref这个类传入到Elephant的方法open中 依赖关系:就是将一个类的类名或者对象传给另一个类的方法中

练习题:

实现两个
大象执行open方法:
显示:'哪个大象 大象默念三声:芝麻开门'
显示:'哪个冰箱门,冰箱门被打开了'
# 大象类
class Elephant: def __init__(self, name):
self.name = name def open(self,ref1):
# print(ref1)
print(f'大象{self.name}默念三声: 芝麻开门')
# ref1.open_door()
def close(self):
print('大象默念三声: 芝麻关门') # 冰箱类
class Refrigerator: def __init__(self, name):
self.name = name def open_door(self,ele1):
# print(ele1)
print(f'{self.name}冰箱门被打开了...') def closer_door(self):
print('冰箱门被关闭了...') ele = Elephant('齐齐')
ref = Refrigerator('美菱')
ele.open(ref)
ref.open_door(ele)
ele1.open(ref)
# 以上代码敲十遍

一句话总结

依赖关系:就是将一个类的类名或者对象传给另一个类的方法中
就是将一个类Refrigerator('美菱')的类名或者实例化后的对象ref传给另一个类Elephant的ele.open方法中

2.组合关系(关联组合聚合)

class Boy:

		def __init__(self, name):
self.name = name def meet(self,girl_friend=None):
self.girl_friend = girl_friend def have_diner(self):
if self.girl_friend:
print(f'{self.name}请{self.girl_friend.name}一起吃六块钱的麻辣烫')
else:
print('单身狗,看别人吃') class Girl: def __init__(self, name, age):
self.name = name
self.age = age
# 操作1
wu = Boy('吴超')
# wu.have_diner()
# 输出结果
单身狗,吃什么吃
# flower = Girl('如花', 48) # 操作2
flower = Girl('如花', 48)
# 组合: 将一个类的对象封装成另一个类的对象的属性中
wu.meet(flower)
# 输出结果
吴超请如花一起吃六块钱麻辣烫

敲十遍的练习题

class GameRole: # 定义一个游戏的类

    def __init__(self, name, ad, hp): # 设置默认方法:姓名,攻击力,血量

        self.name = name
self.ad = ad
self.hp = hp def attack(self,p1): # 设置一个攻击的方法,传入的值是,被攻击人的名字
p1.hp = p1.hp - self.ad # 传入被攻击人的血量等于被攻击人原来的血量减去攻击人的攻击力
print(f'{self.name}攻击{p1.name},{p1.name}掉了{self.ad}血,还剩{p1.hp}血') # 这里self.name就是攻击人的名字,p1是被攻击人的名字,被攻击人掉的血也就是是攻击人的攻击力,还剩下的血量是被攻击人之前的血量减去攻击人的攻击力 def equit_weapon(self,wea):# 定义了一个装备武器的方法,传入的值是
self.weapon = wea class Weapon: def __init__(self, name, ad):
self.name = name
self.ad = ad def attick(self, p1, p2):
self.p1 = p1
self.p2 = p2 print(f'{self.p1}使用{self.name}攻击了{self.p2},{self.p2}掉了{self.ad}血') gailun = GameRole('盖伦', 100, 10) #传入一个 盖伦的对象属性
jianhao = GameRole('剑豪', 200, 20) gailun_gj = Weapon('青龙偃月刀', 20)
jianhao_gj = Weapon('九门大提督枪', 30) gailun.equit_weapon(gailun_gj) #
jianhao.equit_weapon(jianhao_gj)
gailun.weapon.attick('盖伦', '剑豪')
jianhao.weapon.attick('剑豪', '盖伦')

一句话总结:

依赖关系:   就是将一个类的类名或者对象传给另一个类的方法中
组合关系就是,将一个类的对象封装到另一个类的对象的属性中,以如花为例,将类Girl('如花', 48)的实例化后的对象flower封装到另一个类Boy('吴超')的实例化对象wu的meet属性中,用wu.meet(flower)表示

继承关系

class A:
pass class B:
pass

python之面向对象的关系的更多相关文章

  1. Python进阶---面向对象的程序设计思想

    Python的面向对象 一.面向过程与面向对象的对比 面向过程的程序设计的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. 优 ...

  2. Python之面向对象一

    引子 小游戏:人狗大战 角色:人和狗 角色属性:姓名,血量,战斗力和性别(种类) 技能:打/咬 用函数实现人打狗和狗咬人的情形 def Dog(name,blood,aggr,kind): dog = ...

  3. python基础——面向对象进阶下

    python基础--面向对象进阶下 1 __setitem__,__getitem,__delitem__ 把对象操作属性模拟成字典的格式 想对比__getattr__(), __setattr__( ...

  4. python基础——面向对象的程序设计

    python基础--面向对象的程序设计 1 什么是面向对象的程序设计 面向过程的程序设计的核心是过程,过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. 优 ...

  5. python学习------面向对象的程序设计

    一 面向对象的程序设计的由来 1940年以前:面向机器 最早的程序设计都是采用机器语言来编写的,直接使用二进制码来表示机器能够识别和执行的指令和数 据.简单来说,就是直接编写 和 的序列来代表程序语言 ...

  6. 【转】Python之面向对象与类

    [转]Python之面向对象与类 本节内容 面向对象的概念 类的封装 类的继承 类的多态 静态方法.类方法 和 属性方法 类的特殊成员方法 继承层级关系中子类的实例对象对属性的查找顺序问题 一.面向对 ...

  7. python 历险记(二)— python 的面向对象

    目录 前言 类和对象 如何定义和实例化类? 如何定义和使用属性? 什么是方法? 静态方法和普通方法 构造函数该怎么写? str 方法怎么写? 多态是什么? 继承性和 java 是一样的吗? 父类和子类 ...

  8. what's the python之面向对象

    编程分为面向过程和面向对象,首先我们要了解什么是面向对象. 面向对象 面向过程就是我们之前学的内容,主要是函数式,其核心是过程,过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全 ...

  9. Python学习---面向对象的学习[基础]

    面向对象 面向对象的三大特性是指:封装.继承和多态. 说明: Python可以函数式编程,也可以面向对象编程 l 面向过程:根据业务逻辑从上到下写垒代码 l 函数式 :将某功能代码封装到函数中,日后便 ...

随机推荐

  1. Snap们崛起告诉我们:这个世界太需要悄悄话

    ​ 北京时间3月3日凌晨,"阅后即焚"应用Snapchat母公司Snap在纽约证券交易所上市.开盘价24美元,比其初定的17美元IPO价格高出近41.2%,按照24美元的股价计算, ...

  2. C++程序设计--运算符重载

    目录 1, 运算符重载2, 赋值运算符的重载3, 流插入运算符重载4,自加/自减运算符的重载 运算符重载 作用:对抽象数据类型也能够直接使用C++提供的运算符.使得程序更简洁.代码更容易理解. 运算符 ...

  3. LeetCode 题解 | 237. 删除链表中的节点

    题目描述: 请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点. 现有一个链表 -- head = [4,5,1,9],它可以表示为: 示例 1: 输入: hea ...

  4. python画一颗拳头大的💗

    用上turtle库后,各种画,今天画个拳头大的爱心@.@. 下面贴下代码: # -*- coding: utf-8 -*- # Nola import pygame import time impor ...

  5. springboot配置文件读取pom文件信息

    解决的问题 springboot(当然别的也可以)多环境切换需要该配置文件,打包时不够方便. 解决: 配置文件能读取pom文件中的配置,根据命令选择不同配置注入springboot的配置文件中 pom ...

  6. 聊一聊关于MySQL的count(*)

    0.背景 自从大家对于MySQL数据库的稳定性有了更高的追求后,经常有小伙伴有这样的疑问,对于count(*)这样的操作,有没有正确的姿势,或者有没有可以优化的地方? 但答案比较残酷,如果已经使用了正 ...

  7. 【Amaple教程】2. 模块

    正如它的名字,模块用于amaplejs单页应用的页面分割,所有的跳转更新和代码编写都是以模块为单位的. 定义一个模块 一个模块由<module>标签对包含,内部分为template模板.J ...

  8. vue中的自定义分页插件组件

    介绍一下,已经有很多的vue分页的组件了,大家都是大同小易,那么我就结合自身的使用,写出了一片文章 首先在新建一个分页模块 在模块中引入相应的代码,(内有详细的注释) template中 <di ...

  9. 安装archlinux的另辟蹊径的命令及心得

    先说说我为什么开始入坑archlinux的吧,我最喜欢这个系统的一点就是简洁,DIY程度高,可以定制真正属于自己的专用系统.(像gentoo的话,就为了日常使用也没必要那么折腾,除非你是想在折腾的过程 ...

  10. nes 红白机模拟器 第4篇 linux 手柄驱动支持

    小霸王学习机的真实手柄,实测CPU 占用 80% 接线图: 手柄读时序: joypad.c 驱动: 普通的字符设备驱动. #include <linux/module.h> #includ ...