Python面向对象02/类的空间问题

Posted liubing8

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python面向对象02/类的空间问题相关的知识,希望对你有一定的参考价值。

Python面向对象02/类的空间问题

内容大纲

1.从空间角度研究类

2..类与类之间的关系

1.类的空间问题

1.1何处可以添加对象属性

在类的__init__可以添加,在类的方法也可以添加,在类的外部也可以添加
# class Human:
#
#     mind = '有思想的'
#
#     def __init__(self, name, age):
#         self.name = name
#         self.age = age
#
#     def eat(self,argv):
#         # self.hobby = '女'
#         Human.body = argv
#         print('吃饭')
#
#
# sun = Human('二狗', 18)
sun.eat()
print(sun.__dict__)
sun.weight = 130
print(sun.__dict__)

1.2何处可以添加类的属性

# 类的内部
# sun.eat('有头有脸')
# 类的外部
# Human.body = '有头四肢'
# print(Human.__dict__)

2.类与对象之间的关系

#对象空间与类空间有相同的名字, 对象. 肯定先从对象空间查找.
#查询顺序:  
#   对象.名字: 对象空间  ______类对象指针_______--> 类空间 ---> 父类空间
#   类名.名字: 类空间 -----> 父类空间
#1.每个对象都可以从类的空间去找,不可以去别的对象空间去找
#2.单向不可逆,类名不可以找到对象的属性
#3.__init__产生对象空间,不是空的,有一个对象指针

技术图片

3.类与类之间的关系

3.1依赖关系

#将一个类的类名或者对象传入另一类的方法中
#class Elephant:
#    def __init__(self,name):
#        self.name = name
#    def open(self,obj):
#        print(f'self.name 默念三声: 3,2,1 开门')
#        obj.be_open()
#    def close(self):
#        print(f'self.name 默念三声: 3,2,1 关门')
#class Refrigerator:
#    def __init__(self, name):
#        self.name = name
#    def be_open(self):
#       print(f'self.name冰箱 被打开了')
#    def be_close(self):
#        print(f'self.name冰箱 被关闭了')
# 
#qiqi = Elephant('河马')
#haier = Refrigerator('海尔')
#qiqi.open(haier)

3.2组合关系

#将一个类的对象封装到另一个类的对象的属性中
# class Boy:
#     def __init__(self, name, girlfriend=None):
#         self.name = name
#         self.girlfriend = girlfriend
#     def have_a_diner(self):
#         if self.girlfriend:
#             print(f'self.name请他的女朋友self.girlfriend一起烛光晚餐')
#         else:
#             print('吃什么吃')
# ergou = Boy('二狗')
# ergou.have_a_diner()
# ergou = Boy('二狗')
# # 只是给二狗封装了一个属性:girlfriend 为一个字符串的数据
# ergou.girlfriend = '乔'
# ergou.have_a_diner()

# class Boy:
#     def __init__(self, name, girlfriend=None):
#         self.name = name
#         self.girlfriend = girlfriend
#     def have_a_diner(self):
#         if self.girlfriend:
#             print(f'self.name请他的self.girlfriend.age岁的,self.girlfriend.body的女朋友self.girlfriend.name一起烛光晚餐')
#         else:
#             print('吃什么吃')
#     def girl_skill(self):
#         print(f'self.name的女朋友的技能:')
#         self.girlfriend.skill()
# class Girl:
#     def __init__(self,name,age,body):
#         self.name = name
#         self.age = age
#         self.body=body
#     def skill(self):
#         print(f'self.name 会做饭')
#
# ergou = Boy('二狗')
# qiao = Girl('乔', 58, '小钢炮')
# ergou.girlfriend = qiao
# ergou.have_a_diner()
# ergou.girl_skill()



# 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,谁掉了self.ad血,  还剩p1.hp血")
#         print(f'p1.name的血量p1.hp')
#
# class Weapon:
#
#     def __init__(self,name,ad):
#         self.name = name
#         self.ad = ad
#
#     def weapon_attack(self, p1, p2):  # 依赖关系
#
#         p2.hp = p2.hp - self.ad
#         print(f'p1.name利用self.name给了p2.name一下子,p2.name掉了self.ad血,还剩p2.hp血')
#
#
#
# gailun = GameRole('盖伦', 10, 100)
# xin = GameRole('菊花信', 20, 80)
# Sword = Weapon('大宝剑',15)
# Musket = Weapon('长缨枪',30)

# 盖伦利用大宝剑给赵信一下子
# Sword.weapon_attack(gailun, xin)
# 1. 功能虽然实现了,但是逻辑上不合理,应该是人物对象调用方法.主体.
# 2. 游戏人物本身就应该绑定武器属性.



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,谁掉了self.ad血,  还剩p1.hp血")
        print(f'p1.name的血量p1.hp')
    def equipment_wea(self, wea):
        self.weapon = wea  # 组合关系

class Weapon:
    def __init__(self,name,ad):
        self.name = name
        self.ad = ad
    def weapon_attack(self, p1, p2):  # 依赖关系
        print(f'self---->: self')  # self 永远默认接受本类实例化对象
        p2.hp = p2.hp - self.ad
        print(f'p1.name利用self.name给了p2.name一下子,p2.name掉了self.ad血,还剩p2.hp血')

gailun = GameRole('盖伦', 10, 100)
xin = GameRole('阿信', 20, 80)
Sword = Weapon('大剑',15)
Musket = Weapon('长缨枪',30)

# 给游戏人物封装武器属性
gailun.equipment_wea(Sword)
# print(gailun.__dict__)
# gailun.weapon.weapon_attack()
# print(f'gailun:  ---> gailun')
# print(f'Sord:  ---> Sword')
gailun.weapon.weapon_attack(gailun,xin)

技术图片

4.今日总结

self永远默认接收本类实例化对象
依赖与组合让类与类产生关系,增强耦合性

5.今日练习

# 1.暴力摩托程序(完成下列需求):
#    1.创建三个游戏人物,分别是:
# ?     苍井井,女,18,攻击力ad为20,血量200
# ?     东尼木木,男,20,攻击力ad为30,血量150
# ?     波多多,女,19,攻击力ad为50,血量80
#
#    2.创建三个游戏武器,分别是:
# ?     平底锅,ad为20
# ?     斧子,ad为50
# ?     双节棍,ad为65
#
#    3.创建三个游戏摩托车,分别是:
# ?      小踏板,速度60迈
# ?      雅马哈,速度80迈
# ?      宝马,速度120迈。
#完成下列需求(利用武器打人掉的血量为武器的ad + 人的ad):
# ?  (1)苍井井骑着小踏板开着60迈的车行驶在赛道上。
# ?  (2)东尼木木骑着宝马开着120迈的车行驶在赛道上。
# ?  (3)波多多骑着雅马哈开着80迈的车行驶在赛道上。
# ?  (4)苍井井赤手空拳打了波多多20滴血,波多多还剩xx血。
# ?  (5)东尼木木赤手空拳打了波多多30滴血,波多多还剩xx血。
# ?  (6)波多多利用平底锅打了苍井井一平底锅,苍井井还剩xx血。
# ?  (7)波多多利用斧子打了东尼木木一斧子,东尼木木还剩xx血。
?  (8)苍井井骑着宝马打了骑着小踏板的东尼木木一双节棍,东尼木木哭了,还剩xx血。(选做)
?  (9)波多多骑着小踏板打了骑着雅马哈的东尼木木一斧子,东尼木木哭了,还剩xx血。(选做)
# class Person:
#     def __init__(self,name,sex,age,ad,hp):
#         self.name = name
#         self.sex = sex
#         self.age = age
#         self.ad = ad
#         self.hp = hp
#     def d_car(self,car):
#         self.car = car
#         print(f'self.name骑着car.name开着car.speed迈的车行驶在赛道上。')
#     def person_attack(self,p1):
#         p1.hp -= self.ad
#         print(f'self.name赤手空拳打了p1.nameself.ad滴血,p1.name还剩p1.hp血')
#
#     def wea_sttack(self,wea):
#         self.wea = wea
# class Weapon:
#     def __init__(self,name,ad):
#         self.name = name
#         self.ad = ad
#
#     def weapon_attack(self,p1,p2):
#         p2.hp = p2.hp - p1.ad - self.ad
#         print(f'p1.name利用self.name打了p2.name一self.name,p2.name还剩p2.hp血。')
#
#     def toatl_attack(self,p1,p2,c1,c2):
#         p2.hp = p2.hp - p1.ad - self.ad
#         print(f'p1.name骑着c1.name打了骑着c2.name的p2.name一self.name,p2.name哭了,还剩p2.hp血。')
# class Car:
#     def __init__(self,name,speed):
#         self.name = name
#         self.speed = speed
#
# cang = Person("苍井井","女",18,20,200)
# dong = Person("东尼木木","男",20,30,150)
# bo = Person("波多多","女",19,50,80)
#
# pan = Weapon("平底锅",20)
# axe = Weapon("斧子",50)
# nunchakus = Weapon("双节棍",65)
#
# small_pedal = Car("小踏板",60)
# yamaha = Car("雅马哈",80)
# bwm = Car("宝马",120)

# cang.d_car(small_pedal)
# dong.d_car(bwm)
# bo.d_car(yamaha)
#
# cang.person_attack(bo)
# dong.person_attack(bo)

# bo.wea_sttack(pan)
# bo.wea.weapon_attack(bo,cang)
# bo.wea_sttack(axe)
# bo.wea.weapon_attack(bo,dong)

# cang.wea_sttack(bwm)
# dong.wea_sttack(small_pedal)
# nunchakus.toatl_attack(cang,dong,cang.wea,dong.wea)
# bo.wea_sttack(pan)
# dong.wea_sttack(yamaha)
# axe.toatl_attack(cang,dong,bo.wea,dong.wea)
#
#
# 2.定义一个类,计算圆的周长和面积。
# class Round:
#     def __init__(self,r):
#         self.r = r
#     def perimeter(self):
#         print(2*3.14*self.r)
#     def area(self):
#         print(3.14*self.r**2)
# obj = Round(3)
# obj.perimeter()
# obj.area()
#
# 3.定义一个圆环类,计算圆环的周长和面积(升级题)。
# class Ring:
#     def __init__(self,r1,r2):
#         self.r1 = r1
#         self.r2 = r2
#     def perimeter(self):
#         print(2*3.14*(self.r2+self.r1))
#     def area(self):
#         print(3.14*(self.r2**2-self.r1**2))
# obj = Ring(4,5)
# obj.perimeter()
# obj.area()
#
4.定义一个学校类,一个老师类。
# - 学校类要求:
# - 学校类封装学校名称,学校地址,以及相关老师(以列表形式存放老师对象)的属性。
# - name: 学校名称。
# - address: 具体地址。
# - teacher_list: []。
# - 学校类设置添加老师对象的方法。
# - 老师类封装姓名,教授学科,以及所属学校的具体对象。
# - name: 老师名。
# - course: 学科。
# - school: 具体学校对象。
# - 实例化2个校区:
# - 北京校区,美丽的沙河;
# - 深圳校区,南山区。
# - 实例化6个老师:
# - 太白,Python, 北京校区对象。
# - 吴超,linux, 北京校区对象。
# - 宝元,python, 北京校区对象。
# - 苑昊,python, 深圳校区对象。
# - 小虎,linux, 深圳校区对象。
# - 小王,Python,深圳校区对象。
# - 完成以下具体需求:
# 1.获取太白所属学校名称。
# 2.获取太白所属学校的学校地址。
# 3.将所有属于北京校区的所有老师名展示出来,并添加到一个列表中。
# 4.将所有属于深圳校区的所有老师以及所负责的学科展示出来。
# 5.将两个校区的负责Python学科的所有老师对象添加到一个列表中。
# 6.将两个校区的负责linux学科的所有老师对象添加到一个列表中并循环展示出来。
# 7.将北京校区这个对象利用pickle写入文件中,然后读取出来,并展示出所属于北京校区的老师姓名。
# class School:
#     def __init__(self, name, address):
#         self.name = name
#         self.address = address
#         self.teacher_list = []
#     def add_teacher_object(self,obj):
#         self.teacher_list.append(obj)
#
# class Teacher:
#     def __init__(self, name, course, school_object):
#         self.name = name
#         self.course = course
#         self.school = school_object
#
# school1 = School("北京校区","美丽的沙河")
# school2 = School("深圳校区","南山区")
#
# taibai = Teacher("太白","Python",school1)
# wuchao = Teacher("吴超","linux",school1)
# baoyuan = Teacher("宝元","Python",school1)
# yuanhao = Teacher("苑昊","Python",school2)
# xiaohu = Teacher("小虎","linux",school2)
# xiaowang = Teacher("小王","Python",school2)
#
# school1.add_teacher_object(taibai)
# school1.add_teacher_object(wuchao)
# school1.add_teacher_object(baoyuan)
#
# school2.add_teacher_object(yuanhao)
# school2.add_teacher_object(xiaohu)
# school2.add_teacher_object(xiaowang)

# print(taibai.school.name)
# print(taibai.school.address)

# 3.将所有属于北京校区的所有老师名展示出来,并添加到一个列表中。
# lst = []
# for i in school1.teacher_list:
#     print(i.name)
#     lst.append(i.name)
# print(lst)
#
# 4.将所有属于深圳校区的所有老师以及所负责的学科展示出来。
# for i in school2.teacher_list:
#     print(f'i.name老师负责i.course学科')

# 5.将两个校区的负责Python学科的所有老师对象添加到一个列表中。
# lst2 = []
# for i in school2.teacher_list + school1.teacher_list:
#     if i.course == "Python":
#         lst2.append(i.name)
# print(lst2)
#
# 6.将两个校区的负责linux学科的所有老师对象添加到一个列表中并循环展示出来。
# lst3 = []
# for i in school2.teacher_list + school1.teacher_list:
#     if i.course == "linux":
#         lst2.append(i.name)
# print(lst3)
# for i in lst3:
#     print(i)

# 7.将北京校区这个对象利用pickle写入文件中,然后读取出来,并展示出所属于北京校区的老师姓名。
# import pickle
# pickle.dump(school1,open("text1","wb"))
# obj = pickle.load(open("text1","rb"))
# for i in obj.teacher_list:
#     print(i.name)

以上是关于Python面向对象02/类的空间问题的主要内容,如果未能解决你的问题,请参考以下文章

python 面向对象专题:类的空间问题类与对象之间的关系类与类之间的关系

Python面向对象 类的空间问题

Python学习之旅—面向对象进阶知识:类的命名空间,类的组合与继承

Python -- 面向对象:类空间问题以及类之间的关系

Python之面向对象类的空间问题及类之间的关系

02面向对象之:类空间问题及类之间的关系