python之面向对象的关系
一、从空间角度研究类
类外面可以给对象封装属性
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之面向对象的关系的更多相关文章
- Python进阶---面向对象的程序设计思想
Python的面向对象 一.面向过程与面向对象的对比 面向过程的程序设计的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. 优 ...
- Python之面向对象一
引子 小游戏:人狗大战 角色:人和狗 角色属性:姓名,血量,战斗力和性别(种类) 技能:打/咬 用函数实现人打狗和狗咬人的情形 def Dog(name,blood,aggr,kind): dog = ...
- python基础——面向对象进阶下
python基础--面向对象进阶下 1 __setitem__,__getitem,__delitem__ 把对象操作属性模拟成字典的格式 想对比__getattr__(), __setattr__( ...
- python基础——面向对象的程序设计
python基础--面向对象的程序设计 1 什么是面向对象的程序设计 面向过程的程序设计的核心是过程,过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. 优 ...
- python学习------面向对象的程序设计
一 面向对象的程序设计的由来 1940年以前:面向机器 最早的程序设计都是采用机器语言来编写的,直接使用二进制码来表示机器能够识别和执行的指令和数 据.简单来说,就是直接编写 和 的序列来代表程序语言 ...
- 【转】Python之面向对象与类
[转]Python之面向对象与类 本节内容 面向对象的概念 类的封装 类的继承 类的多态 静态方法.类方法 和 属性方法 类的特殊成员方法 继承层级关系中子类的实例对象对属性的查找顺序问题 一.面向对 ...
- python 历险记(二)— python 的面向对象
目录 前言 类和对象 如何定义和实例化类? 如何定义和使用属性? 什么是方法? 静态方法和普通方法 构造函数该怎么写? str 方法怎么写? 多态是什么? 继承性和 java 是一样的吗? 父类和子类 ...
- what's the python之面向对象
编程分为面向过程和面向对象,首先我们要了解什么是面向对象. 面向对象 面向过程就是我们之前学的内容,主要是函数式,其核心是过程,过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全 ...
- Python学习---面向对象的学习[基础]
面向对象 面向对象的三大特性是指:封装.继承和多态. 说明: Python可以函数式编程,也可以面向对象编程 l 面向过程:根据业务逻辑从上到下写垒代码 l 函数式 :将某功能代码封装到函数中,日后便 ...
随机推荐
- Snap们崛起告诉我们:这个世界太需要悄悄话
北京时间3月3日凌晨,"阅后即焚"应用Snapchat母公司Snap在纽约证券交易所上市.开盘价24美元,比其初定的17美元IPO价格高出近41.2%,按照24美元的股价计算, ...
- C++程序设计--运算符重载
目录 1, 运算符重载2, 赋值运算符的重载3, 流插入运算符重载4,自加/自减运算符的重载 运算符重载 作用:对抽象数据类型也能够直接使用C++提供的运算符.使得程序更简洁.代码更容易理解. 运算符 ...
- LeetCode 题解 | 237. 删除链表中的节点
题目描述: 请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点. 现有一个链表 -- head = [4,5,1,9],它可以表示为: 示例 1: 输入: hea ...
- python画一颗拳头大的💗
用上turtle库后,各种画,今天画个拳头大的爱心@.@. 下面贴下代码: # -*- coding: utf-8 -*- # Nola import pygame import time impor ...
- springboot配置文件读取pom文件信息
解决的问题 springboot(当然别的也可以)多环境切换需要该配置文件,打包时不够方便. 解决: 配置文件能读取pom文件中的配置,根据命令选择不同配置注入springboot的配置文件中 pom ...
- 聊一聊关于MySQL的count(*)
0.背景 自从大家对于MySQL数据库的稳定性有了更高的追求后,经常有小伙伴有这样的疑问,对于count(*)这样的操作,有没有正确的姿势,或者有没有可以优化的地方? 但答案比较残酷,如果已经使用了正 ...
- 【Amaple教程】2. 模块
正如它的名字,模块用于amaplejs单页应用的页面分割,所有的跳转更新和代码编写都是以模块为单位的. 定义一个模块 一个模块由<module>标签对包含,内部分为template模板.J ...
- vue中的自定义分页插件组件
介绍一下,已经有很多的vue分页的组件了,大家都是大同小易,那么我就结合自身的使用,写出了一片文章 首先在新建一个分页模块 在模块中引入相应的代码,(内有详细的注释) template中 <di ...
- 安装archlinux的另辟蹊径的命令及心得
先说说我为什么开始入坑archlinux的吧,我最喜欢这个系统的一点就是简洁,DIY程度高,可以定制真正属于自己的专用系统.(像gentoo的话,就为了日常使用也没必要那么折腾,除非你是想在折腾的过程 ...
- nes 红白机模拟器 第4篇 linux 手柄驱动支持
小霸王学习机的真实手柄,实测CPU 占用 80% 接线图: 手柄读时序: joypad.c 驱动: 普通的字符设备驱动. #include <linux/module.h> #includ ...