1. 依赖关系
在方法中引入另一个类的对象 (最不紧密的一种关系)
依赖关系都是把另一个对象当做参数
class Elephant:

    def __init__(self, name):
self.name = name def open(self, ref):
print('冰箱开门吧')
ref.open_door() def close(self, ref):
print('冰箱关门吧')
ref.close_door() def get_in(self):
print('进冰箱装自己') class Refrigerator: def open_door(self):
print('冰箱默默地打开了自己的门') def close_door(self):
print('冰箱默默地关上了自己的门') class GaoYaGuo:
def open_door(self):
print('高压锅打开了自己的盖子') def close_door(self):
print('高压锅关上了自己的盖子') e = Elephant('小象')
ref1 = Refrigerator()
guo = GaoYaGuo()
#大象进冰箱
e.open(ref1)
e.get_in()
e.close(ref1)
#大象进了高压锅
e.open(guo)
e.get_in()
e.close(guo) # 大象与冰箱和高压锅是依赖关系,联系并不紧密,可以更改对象

依赖关系

2. 关联关系, 聚合关系, 组合关系
类与类之间的关系是比较紧密的. a需要b做什么,a中要拥有b
class Boy:
def __init__(self, name, character, girlFriend=None):
self.name = name
self.character = character
self.girlFriend = girlFriend def meet(self, girl): # 给girlFriend传值
self.girlFriend = girl def eat(self):
if self.girlFriend: # if True 如果有girlFriend
print('%s和%s随便吃' % (self.name, self.girlFriend.name))
else: # 如果没有girlFriend
print('单身狗不用吃') class Girl:
def __init__(self, name):
self.name = name def eat(self):
print('%s在吃饭' % self.name) girl = Girl('白骨精') alex = Boy('金角大王', '娘') alex.eat()
alex.meet(girl)
alex.eat() girl.eat()
alex.girlFriend.eat()

关联关系

#一个对多个

class School:
# def __init__(self, name, address, tel, teach_list=[]): #teach_list写在这里是默认值参数,可以共用,如果该参数是可以修改的,一旦内容改变,不同对象共用相同内容
def __init__(self, name, address, tel):
self.name = name
self.address = address
self.tel = tel
self.__teach_list = [] #每一个对象(学校)都会有一个teach_list,默认是空 # 教师信息不对外展示,私有属性 def hire(self, teacher):
self.__teach_list.append(teacher) def display(self):
for el in self.__teach_list:
print(el.name, el.hobby) class Teacher:
def __init__(self, name, gender, salary, hobby, school):
self.name = name
self.gender = gender
self.salary = salary
self.hobby = hobby
self.school = school oldboy_bj = School("北京老男孩", "美丽富饶的沙河", "")
oldboy_sh = School("北京老男孩上海分校", "上海浦东", "")
oldboy_sz = School("北京老男孩深圳分校(骑士计划)", "南山区", "") t1 = Teacher("配齐", "男", 200000, "上课", oldboy_bj)
t2 = Teacher("太白", "男", 150000, "开车", oldboy_bj)
t3 = Teacher("Eggon", "男", 123456, "钻研技术", oldboy_sh)
t4 = Teacher("高鑫", "女", 45678, "相夫教子", oldboy_sz)
t5 = Teacher("日天", "男", 666, "看天", oldboy_sz) print(t3.school.name, t3.school.address) # 找到老师所在的学校名称和地址 oldboy_bj.hire(t1)
oldboy_bj.hire(t2)
oldboy_bj.display() oldboy_sh.hire(t3) oldboy_sz.hire(t4)
oldboy_sz.hire(t5) oldboy_sz.display()

关联关系,一对多个对象

3. 继承关系, 实现关系
self: 当前执行这个方法的对象   子类在不影响父类的程序运行的基础上对父类进行的扩充和扩展.
  父类:超类,基类. 子类:派生类 4. 特殊成员(__init__) (尽量了解)
__init__()
__new__()
__getitem__() obj[xxx]
__setitem__() obj[xxx] = xxxx
__delitem__() del obj[xxx]
__call__() obj()
__str__() print(obj) 返回这个对象的字符串表示形式
__enter__()
__exit__() with

类名和对象是否可以作为key
# 可哈希. 内部是否哈希算法 __hash__

class Foo(object): # 所有的类都会默认继承object
def __init__(self):
pass
def func(self):
pass
__hash__ = None # 默认的类和对象都是可哈希的,如果加了__hash__ = None,则变为不可哈希 dic = {}
dic[Foo] = "" # 类名是可哈希的。
dic[Foo()] = "刘伟" # 类中是否包含__hash__
print(dic)
class Foo:
def __init__(self):
print("我是初始化") def __call__(self, *args, **kwargs):
print("我是靠") def __getitem__(self, item):
print("我是getitem", item)
return "大胖小子"
def __setitem__(self, key, value):
print(key, value) def __delitem__(self, key):
print(key) def __enter__(self):
print("我是进入")
return "周润发"
def __exit__(self, exc_type, exc_val, exc_tb):
print("我是出来") # 类名() __init__() 构造方法
obj = Foo() # 对象() __call__()
obj() # python特有的. # 对象[xxx] 从对象中获取数据 默认执行__getitem__()
print(obj['小明']) # 对象[xxx] = ,.... 默认执行__setitem__()
obj["汪峰"] = "章子怡" # del obj[key] 默认执行__delitem__()
# del obj['马化腾'] # dic = {"name":'汪峰', 'age':18}
# print(dic['name'])
#
# with obj as xx: # __enter__() __exit__()
# print(xx)
# print("你好. 我叫周润发")
class Boy(object):
def __init__(self, name, address, phone):
self.name = name
self.address = address
self.phone = phone def __str__(self): #打印对象时显示对象内容 而不是显示类中的对象
return "name:%s, address:%s phone:%s" % (self.name, self.address, self.phone) def __new__(cls, *args, **kwargs):
print("新概念")
return object.__new__(cls) # 这句话才是创建对象. b = Boy("alex", "北京沙河", "")
print(b)
# __getitem__的用法
#方法一: class DataBase:
'''Python 3 中的类''' def __init__(self, id, address):
'''初始化方法'''
self.id = id
self.address = address
self.d = {self.id: 1,
self.address: "192.168.1.1",
} def __getitem__(self, key):
# return self.__dict__.get(key, "100")
return self.d.get(key, "default") data = DataBase(1, "192.168.2.11")
print(data["hi"])
print(data[data.id]) # 方法二 class DataBase:
'''Python 3 中的类''' def __init__(self, id, address):
'''初始化方法'''
self.id = id
self.address = address def __getitem__(self, key):
return self.__dict__.get(key, "") data = DataBase(1, "192.168.2.11")
print(data["hi"])
print(data["id"]) # 方法三 class STgetitem: def __init__(self, text):
self.text = text def __getitem__(self, index):
result = self.text[index].upper()
return result p = STgetitem("黄哥Python")
print(p[0])
print("------------------------")
for char in p:
print(char) # 示例引用自https://zhuanlan.zhihu.com/p/27661382

__getitem__用法示例

class SetAndGet:
__dv__ = {} # Dictionary Values
def __init__(self, dv={}):
self.__dv__ = dv def __getitem__(self, key):
return self.__dv__.get(key, None) def __setitem__(self, key, value):
self.__dv__[key] = value
print('我是setitem') obj = SetAndGet()
obj['name'] = 'alex'
print(obj.__dv__)
print(obj['name'])

getitem与setitem用法示例

Day18--Python--面向对象--类与类之间的关系的更多相关文章

  1. python面向对象与结构成员之间的关系

    1面向对象结构分析:----面向对象整体大致分为两块区域:-------第一部分:静态字段(静态变量)部分-------第二部分:方法部分--每个区块可以分为多个小部分 class A: countr ...

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

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

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

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

  4. Python面向对象之接口类(抽象类)

    Python面向对象之接口类(抽象类):就是制定一个规范. 比如定义了一个接口类(抽象类)(他们是不可以进行实例化的,这就是他为什么是制定一个规范的原因). 他的定义是需要abc模块,要变的就是他的方 ...

  5. Python面向对象06 /元类type、反射、函数与类的区别、特殊的双下方法

    Python面向对象06 /元类type.反射.函数与类的区别.特殊的双下方法 目录 Python面向对象06 /元类type.反射.函数与类的区别.特殊的双下方法 1. 元类type 2. 反射 3 ...

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

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

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

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

  8. python包管理工具他们之间的关系

    python包管理工具之间的关系 现在的python包管理工具有很多,非常混乱,必须理清他们之间的关系才能更好的使用python构建强大的包关系系统工具. 首先:python官方推荐的第三方库是PyP ...

  9. Python进阶----表与表之间的关系(一对一,一对多,多对多),增删改查操作

    Python进阶----表与表之间的关系(一对一,一对多,多对多),增删改查操作,单表查询,多表查询 一丶表与表之间的关系 背景: ​ ​ ​  ​ ​ 由于如果只使用一张表存储所有的数据,就会操作数 ...

  10. Python面向对象-概念、类、实例

    OOP——Object Oriented Programming,面向对象编程,是一种程序设计思想.该思想将对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. 区别于面向过程的程序设计即把计 ...

随机推荐

  1. logging 实例

    import logging from logging.handlers import RotatingFileHandler import os FILE_DIR = os.path.join(os ...

  2. 一、ABP框架框架摘要

    ABP框架几点说明: 一.什么是ABP ABP是一个建立在最新的ASP.NET的MVC和Web API技术的应用框架.它可以很容易地使用依赖注入.日志记录.验证.异常处理.本地化等,也使用流行的框架和 ...

  3. HTTP协议 - 使用php模拟get/post请求

    首先 有个疑问, 是不是只有浏览器才能发送http 请求? 答案肯定是错的,第一篇就说了,http是由请求行,请求头,请求主体三个部分组成,那么我们可不可以用代码来模拟一下get和post请求呢: 首 ...

  4. codeforces982F

    The Meeting Place Cannot Be Changed CodeForces - 982F Petr is a detective in Braginsk. Somebody stol ...

  5. poj-2513(字典树+欧拉通路)

    题意:给你n个火柴棍,每个火柴棍头和尾两种颜色,问你是否存在能够把这些火柴棍摆成一行的情况,两个相连的火柴棍的颜色需要一样: 解题思路:最初的思路是用map标记颜色,然后把每种颜色看作点,每根火柴棍看 ...

  6. Nginx 热部署最版本

    L10 进入nginx里的sbin目录 拷贝原先的做备份 cp nginx nginx.old 然后将已经编译好的nginx二进制文件复制到sbin目录下并覆盖原有的二进制文件 kill -USR2 ...

  7. Nginx 针对上游服务器缓存

    L:99 nginx缓存 : 定义存放缓存的载体 proxy_cache 指令 Syntax: proxy_cache zone | off; Default: proxy_cache off; Co ...

  8. JarvisOJ BASIC -.-字符串

    请选手观察以下密文并转换成flag形式 ..-. .-.. .- --. ..... ..--- ..--- ----- .---- ---.. -.. -.... -.... ..... ...-- ...

  9. BZOJ3894文理分科——最小割

    题目描述  文理分科是一件很纠结的事情!(虽然看到这个题目的人肯定都没有纠 结过)  小P所在的班级要进行文理分科.他的班级可以用一个n*m的矩阵进行 描述,每个格子代表一个同学的座位.每位同学必须从 ...

  10. BZOJ3638[Codeforces280D]k-Maximum Subsequence Sum&BZOJ3272Zgg吃东西&BZOJ3267KC采花——模拟费用流+线段树

    题目描述 给一列数,要求支持操作: 1.修改某个数的值 2.读入l,r,k,询问在[l,r]内选不相交的不超过k个子段,最大的和是多少. 输入 The first line contains inte ...