面向对象-练习题

时间:2023-02-23 14:14:28
# day 15
'''
1,完成下列功能:
  1.1创建一个人类Person,再类中创建3个静态变量(静态字段)
    animal = '高级动物'
    soul = '有灵魂'
    language = '语言'
  1.2在类中定义三个方法,吃饭,睡觉,工作.
  1.3在此类中的__init__方法中,给对象封装5个属性:国家,姓名,性别,年龄,  身高.
  1.4实例化四个人类对象:
    第一个人类对象p1属性为:中国,alex,未知,42,175.
    第二个人类对象p2属性为:美国,武大,男,35,160.
    第三个人类对象p3属性为:你自己定义.
    第四个人类对象p4属性为:p1的国籍,p2的名字,p3的性别,p2的年龄,p3  的身高.
  1.5 通过p1对象执行吃饭方法,方法里面打印:alex在吃饭.
  1.6 通过p2对象执行吃饭方法,方法里面打印:武大在吃饭.
  1.7 通过p3对象执行吃饭方法,方法里面打印:(p3对象自己的名字)在吃饭.
  1.8 通过p1对象找到Person的静态变量 animal
  1.9 通过p2对象找到Person的静态变量 soul
  2.0 通过p3对象找到Person的静态变量 language
'''

# 1.1  创建一个人类Person,再类中创建3个静态变量(静态字段)

class Person:
    animal = '高级动物'
    soul = '有灵魂'
    language = '语言'

# 1.2 在类中定义三个方法,吃饭,睡觉,工作。

    def meal(self):
        print('%s在吃饭' % (self.name))
    def sleep(self):
        pass
    def work(self):
        pass
# 1.3在此类中的__init__方法中,给对象封装5个属性:国家,姓名,性别,年龄,  身高。
    def __init__(self,nation,name,sex,age,height):
        self.nation = nation
        self.name = name
        self.sex = sex
        self.age = age
        self.height = height
# 1.4 实例化4个人类对象
p1 = Person('中国','alex','未知',42,175)
p2 = Person('美国','武大','',35,160)
p3 = Person('中国','马玉刚','',31,180)
p4 = Person('中国','武大','',35,180)

# 1.5 通过p1对象执行吃饭方法,方法里面打印:alex在吃饭.
p1.meal()

#  1.6 通过p2对象执行吃饭方法,方法里面打印:武大在吃饭.
p2.meal()

# 1.7 通过p3对象执行吃饭方法,方法里面打印:(p3对象自己的名字)在吃饭.
p3.meal()

# 1.8 通过p1对象找到Person的静态变量 animal
print(p1.animal)

# 1.9 通过p2对象找到Person的静态变量 soul
print(p2.soul)

# 2.0 通过p3对象找到Person的静态变量 language
print(p3.language)

'''
2,通过自己创建类,实例化对象
  在终端输出如下信息
  小明,10岁,男,上山去砍柴
  小明,10岁,男,开车去东北
  小明,10岁,男,最爱大保健
  老李,90岁,男,上山去砍柴
  老李,90岁,男,开车去东北
  老李,90岁,男,最爱大保健
  老张…
'''
class Person:
    hobbly1 = '上山去砍柴'
    hobbly2 = '开车去东北'
    hobbly3 = '最爱大保健'
    def __init__(self,name,age,sex):  # 封装对象的属性。
        self.name = name
        self.age = age
        self.sex = sex
    def show(self):
        print('%s,%s,%s,%s' % (self.name, self.age, self.sex, self.hobbly1))
        print('%s,%s,%s,%s' % (self.name, self.age, self.sex, self.hobbly2))
        print('%s,%s,%s,%s' % (self.name, self.age, self.sex, self.hobbly3))

p1 = Person('小明', '10岁', '')
p2 = Person('老李', '90岁', '')
p1.show()
p2.show()

'''
3,模拟英雄联盟写一个游戏人物的类(升级题).
  要求:
  (1)创建一个 Game_role的类.
  (2) 构造方法中给对象封装name,ad(攻击力),hp(血量).三个属性.
  (3) 创建一个attack方法,此方法是实例化两个对象,互相攻击的功能:
      例: 实例化一个对象 盖伦,ad为10, hp为100
      实例化另个一个对象 剑豪 ad为20, hp为80
      盖伦通过attack方法攻击剑豪,此方法要完成 '谁攻击谁,谁掉了多少血,  还剩多少血'的提示功能.
'''

class Game_role:
    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('%s攻击了%s,%s还剩下%s' % (self.name, p1.name, p1.name, p1.hp))


Gailun = Game_role('盖伦', 10, 100)
Jianhao = Game_role('剑豪', 20, 80)

Gailun.attack(Jianhao)
Jianhao.attack(Gailun)

'''
4,默写内容:
  创建一个人类,定义三个静态变量,在构造方法中封装3个属性.然后实例化一个对象,对象调用自己的属性,对象调用类的静态方法,
  对象调用类中的方法.
  默写一下实例化一个对象,具体经历了哪些阶段。
'''

class Person:
    animal = '高级动物'
    soul = '有灵魂'
    language = '语言'

    def __init__(self, name, sex, age):
        self.name = name
        self.sex = sex
        self.age = age

    def func1(self):
        print('调用类中的方法')
        pass


P1 = Person('马玉刚', 'men', 31)
print(P1.name)
print(P1.animal)
P1.func1()

'''实例化一个对象具体经历的阶段
(1)实例化对象在内存中产生一个对象空间(内存地址)。
(2)自动执行 __init__方法并且将对象空间传给了self参数。***
(3)在 __init__方法中,给对象空间封装一些静态属性。
'''

#  Day 16

'''
1,暴力摩托程序(完成下列需求):
1.1创建三个游戏人物,分别是:
•    苍井井,女,18,攻击力ad为20,血量200
•    东尼木木,男,20,攻击力ad为30,血量150
•    波多多,女,19,攻击力ad为50,血量80
1.2创建三个游戏武器,分别是:
•    平底锅,ad为20
•    斧子,ad为50
•    双节棍,ad为65

1.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 Game_Role:
    def __init__(self, name, sex, age, ad, hp):
        self.name = name
        self.sex = sex
        self.age = age
        self.ad = ad
        self.hp = hp
        self.wea = Weapon()  # 将Weapon实例的对象作为Game_Role封装的一个属性。
        self.veh = Vehicle()  # 将Vehicle实例的对象作为Game_Role封装的一个属性。
    def use_wea(self, wea ):  # 定义使用的武器
        self.wea = wea
    def use_vehicle(self, vehicle,flag = 0 ):   # flag用来标识,如果为0则打印“行驶在赛道上”,否则不打印“行驶在赛道上”。
        self.veh = vehicle
        if flag ==0:
            if self.veh.moto_name == '':
                pass
            else:
                print('%s骑着%s开着%s迈的车行驶在赛道上' % (self.name, vehicle.moto_name, vehicle.speed))
        else:
            pass
    def Strike(self, p1):
        p1.hp = p1.hp - self.getad()
        if self.wea.name == '赤手空拳'and self.veh.moto_name =='':
            print("%s%s打了%s%s滴血,%s还剩%s血" % (self.name, self.wea.name, p1.name, self.getad(), p1.name, p1.hp))
        elif self.wea.name != '赤手空拳'and self.veh.moto_name =='':
            print("%s利用%s打了%s一%s,%s还剩%s血" % (self.name, self.wea.name, p1.name,self.wea.name, p1.name, p1.hp))
        elif self.wea.name != '赤手空拳'and self.veh.moto_name !='':
            print("%s骑着%s打了骑着%s的%s一%s,%s哭了,还剩%s血。" % (self.name, self.veh.moto_name, p1.veh.moto_name, p1.name, self.wea.name, p1.name, p1.hp))
    def getad(self):  # 动态的得到攻击力
            if self.wea:
                ad = self.ad + self.wea.ad
            else:
                ad = self.ad
            return ad

class Weapon:
    def __init__(self, name='赤手空拳', ad=0):
        self.name = name
        self.ad = ad


class Vehicle:
    def __init__(self, moto_name='', speed=0):
        self.moto_name = moto_name
        self.speed = speed

g1 = Game_Role('苍井井', '', 18, 20, 200)  # 苍井井,女,18,攻击力ad为20,血量200
g2 = Game_Role('东尼木木', '', 20, 30, 150)  # 东尼木木,男,20,攻击力ad为30,血量150
g3 = Game_Role('波多多', '', 19, 50, 80)  # 波多多,女,19,攻击力ad为50,血量80

w0 = Weapon('赤手空拳', 0)  # 赤手空拳,ad为0
w1 = Weapon('平底锅', 20)  # 平底锅,ad为20
w2 = Weapon('斧子', 50)  # 斧子,ad为50
w3 = Weapon('双节棍', 65)  # 双节棍,ad为65

v0 = Vehicle('', 0)  #  无,速度0迈
v1 = Vehicle('小踏板', 60)  # 小踏板,速度60迈
v2 = Vehicle('雅马哈', 80)  # 雅马哈,速度80迈
v3 = Vehicle('宝马', 120)  # 宝马,速度120迈


# (1)苍井井骑着小踏板开着60迈的车行驶在赛道上。
g1.use_vehicle(v1)
# (2)东尼木木骑着宝马开着120迈的车行驶在赛道上。
g2.use_vehicle(v3)
# (3)波多多骑着雅马哈开着80迈的车行驶在赛道上。
g3.use_vehicle(v2)
# (4)苍井井赤手空拳打了波多多20滴血,波多多还剩xx血。
g1.use_wea(w0)
g1.use_vehicle(v0)
g1.Strike(g3)
# (5)东尼木木赤手空拳打了波多多30滴血,波多多还剩xx血。
g2.use_wea(w0)
g2.use_vehicle(v0)
g2.Strike(g3)
# (6)波多多利用平底锅打了苍井井一平底锅,苍井井还剩xx血。
g3.use_wea(w1)
g3.use_vehicle(v0)
g3.Strike(g1)
# # (7)波多多利用斧子打了东尼木木一斧子,东尼木木还剩xx血。
g3.use_wea(w2)
g3.use_vehicle(v0)
g3.Strike(g2)
# # (8)苍井井骑着宝马打了骑着小踏板的东尼木木一双节棍,东尼木木哭了,还剩xx血。(选做)
g1.use_vehicle(v3, 1)
g1.use_wea(w3)
g2.use_vehicle(v1, 1)
g1.Strike(g2)
# # (9)波多多骑着小踏板打了骑着雅马哈的东尼木木一斧子,东尼木木哭了,还剩xx血。(选做)
g3.use_vehicle(v1, 1)
g3.use_wea(w2)
g2.use_vehicle(v2, 1)
g3.Strike(g2)


# 2,定义一个类,计算圆的周长和面积。
import math


class circle:
    def Perimeter(self, r):  # 定义圆的周长函数,r为半径。
        perimeter = 2 * math.pi * r
        print('半径为%s的圆的周长为%s' % (r, perimeter))

    def Acreage(self, r):
        acreage = math.pi * (r ** 2)
        print('半径为%s的圆的面积为%s' % (r, acreage))


circle1 = circle()
circle1.Perimeter(0.5)  # 半径为0.5的圆的周长为3.141592653589793
circle1.Acreage(1)  # 半径为1的圆的面积为3.141592653589793


# 3,定义一个圆环类,计算圆环的周长和面积(升级题)。
import math
class Ring:
    def Ring_perimeter(self,r1,r2): # 定义圆环的周长,r1,r2为内环外环的半径。
        if r1 < r2:
            ring_perimeter = math.pi*2*(r2-r1)
            print('内径为%s,外径为%s的圆环的周长为%s' % (r1, r2, ring_perimeter))
        else:
            ring_perimeter =math.pi*2*(r1-r2)
            print('内径为%s,外径为%s的圆环的周长为%s' % (r2, r1, ring_perimeter))
    def Ring_Acreage(self,r1,r2):  # 定义圆环的面积,r1,r2为内环外环的半径。
        if r1 < r2:
            ring_Acreage = math.pi*(r2**2-r1**2)
            print('内径为%s,外径为%s的圆环的面积为%s' % (r1, r2, ring_Acreage))
        else:
            ring_Acreage =math.pi*(r1**2-r2**2)
            print('内径为%s,外径为%s的圆环的面积为%s' % (r2, r1, ring_Acreage))
ring1 = Ring()
ring1.Ring_perimeter(2, 1)
ring1.Ring_Acreage(2, 1)

4,默写内容:创建两个类,让一个类的对象的属性为另一个类的对象。
class Game_Role:
    area = '召唤师峡谷'

    def __init__(self, name, sex, ad, hp):
        self.name = name
        self.sex = sex
        self.ad = ad  # 攻击力
        self.hp = hp  # 血量

    def fight(self, role1):
        role1.hp = role1.hp - self.ad
        print('%s 攻击 %s, %s还剩余%s' % (self.name, role1.name, role1.name, role1.hp))
        # print(self, role1)

    def equit_weapon(self, wea):  # 组合: 对象中的属性是另一个类的对象,将Weapon类的对象sword作为Game_roles类的实例化对象P1的封装的属性。
        self.wea = wea


class Weapon:
    def __init__(self, name, ad):
        self.name = name
        self.ad = ad

    def wea_attack(self, role1, role2):
        role2.hp = role2.hp - self.ad
        print('%s 利用 %s 攻击 %s, %s还剩余%s' % (role1.name, self.name, role2.name, role2.name, role2.hp))
p1 = Game_Role('盖伦', 'man', 30, 500)
p2 = Game_Role('狗头', '', 50, 250)
sword = Weapon('大宝剑', 40)
p1.equit_weapon(sword)  # 此方法就是给p1对象封装一个属性,属性值是sword对象***
p1.wea.wea_attack(p1, p2)  # 通过p1.wea找到sword 然后在sword.wea_attack执行方法,其中self省略了。


#  day17

# 一、简答题

# 1.面向对象的三大特性是什么?面向对象的三大特性是什么?
# 封装、继承、多态

# 2,什么是面向对象的新式类?什么是经典类?
# 新式类:继承object的类。
# 经典类:不继承object的类。
# 说明:python2x中经典类和新式类共存;python3x中全部都是新式类。

# 3,面向对象为什么要有继承?继承的好处是什么?
# 作用(1)节省代码(2)提高效率 (3)让类之间产生关联

# 4,面向对象中super的作用。
# 调用父类(超类)中需要执行的动态方法。

# 二,代码题(通过具体代码完成下列要求):
'''
1,
a,定义一个父类Animal,在构造方法中封装三个属性,姓名,性别,年龄,再给其添加一个eat的方法,方法中显示%s正在吃饭(%s是哪个对象调用此方法,显示哪个对象名字)。
b,定义两个基类Person,Dog,全部继承这个父类Animal.
c,Person类中,有构造方法,封装一个皮肤的属性,有eat方法,方法中显示人类正在吃饭。
d,Dog类中,有构造方法,封装一个毛色的属性,有eat方法,方法中显示狗狗正在吃饭。
上面这几个类创建完成之后,完成下列要求:
①: 实例化一个人类的对象,让其只封装皮肤属性。
②: 实例化一个人类的对象,让其封装姓名,性别,年龄,皮肤四个属性。
③: 实例化一个狗类的对象,让其只封装毛色属性。
④: 实例化一个狗类的对象,让其封装姓名,性别,年龄,毛色四个属性。
⑤: 实例化一个人类的对象,让其只执行父类的eat方法(可以对人类代码进行修改)。
⑥: 实例化一个狗类的对象,让其既执行父类的eat方法,又执行子类的eat方法。

# '''

# ①: 实例化一个人类的对象,让其只封装皮肤属性。
class Animal:
    def __init__(self, name, sex, age):
        self.name = name
        self.sex = sex
        self.age = age
    def eat(self):
        print('%s正在吃饭' % (self.name))
class Person(Animal):
    def __init__(self, skin):   # 定义人类的皮肤属性
        self.skin = skin
        # super(Person, self).__init__(name, sex, age)  # 引用父类封装的属性
    def eat(self):
        print('人类正在吃饭')
class Dog(Animal):
    def __init__(self, hair, name, sex, age):   # 定义狗的毛色属性
        self.hair = hair
        super(Dog, self).__init__(name, sex, age)   # 引用父类封装的属性
    def eat(self):
        print('狗狗正在吃饭')
p1 = Person('黄色')

# ②: 实例化一个人类的对象,让其封装姓名,性别,年龄,皮肤四个属性。
class Animal:
    def __init__(self, name, sex, age):
        self.name = name
        self.sex = sex
        self.age = age
    def eat(self):
        print('%s正在吃饭' % (self.name))
class Person(Animal):
    def __init__(self, skin, name, sex, age):   # 定义人类的皮肤属性
        self.skin = skin
        super(Person, self).__init__(name, sex, age)  # 引用父类封装的属性
    def eat(self):
        print('人类正在吃饭')
class Dog(Animal):
    def __init__(self, hair, name, sex, age):   # 定义狗的毛色属性
        self.hair = hair
        super(Dog, self).__init__(name, sex, age)   # 引用父类封装的属性
    def eat(self):
        print('狗狗正在吃饭')
p2 = Person('黄色', '马玉刚', '', 31)
p2.eat()

# ③: 实例化一个狗类的对象,让其只封装毛色属性。
class Animal:
    def __init__(self, name, sex, age):
        self.name = name
        self.sex = sex
        self.age = age
    def eat(self):
        print('%s正在吃饭' % (self.name))
class Person(Animal):
    def __init__(self, skin, name, sex, age):   # 定义人类的皮肤属性
        self.skin = skin
        super(Person, self).__init__(name, sex, age)  # 引用父类封装的属性
    def eat(self):
        print('人类正在吃饭')
class Dog(Animal):
    def __init__(self, hair):   # 定义狗的毛色属性
        self.hair = hair
    def eat(self):
        print('狗狗正在吃饭')
d1 = Dog('白色')
d1.eat()

# ④: 实例化一个狗类的对象,让其封装姓名,性别,年龄,毛色四个属性。
class Animal:
    def __init__(self, name, sex, age):
        self.name = name
        self.sex = sex
        self.age = age
    def eat(self):
        print('%s正在吃饭' % (self.name))
class Person(Animal):
    def __init__(self, skin, name, sex, age):   # 定义人类的皮肤属性
        self.skin = skin
        super(Person, self).__init__(name, sex, age)  # 引用父类封装的属性
    def eat(self):
        print('人类正在吃饭')
class Dog(Animal):
    def __init__(self, hair, name, sex, age):   # 定义狗的毛色属性
        self.hair = hair
        super(Dog, self).__init__(name, sex, age)   # 引用父类封装的属性
    def eat(self):
        print('狗狗正在吃饭')
d2 = Dog('白色', '哈士奇', '', 2)
d2.eat()

# ⑤: 实例化一个人类的对象,让其只执行父类的eat方法(可以对人类代码进行修改)。
class Animal:
    def __init__(self, name, sex, age):
        self.name = name
        self.sex = sex
        self.age = age
    def eat(self):
        print('%s正在吃饭' % (self.name))
class Person(Animal):
    def __init__(self, skin, name, sex, age):   # 定义人类的皮肤属性
        self.skin = skin
        super(Person, self).__init__(name, sex, age)  # 引用父类封装的属性
class Dog(Animal):
    def __init__(self, hair, name, sex, age):   # 定义狗的毛色属性
        self.hair = hair
        super(Dog, self).__init__(name, sex, age)   # 引用父类封装的属性
p3 = Person('黄色', '马玉刚', '', 31)
p3.eat()

# ⑥: 实例化一个狗类的对象,让其既执行父类的eat方法,又执行子类的eat方法。
class Animal:
    def __init__(self, name, sex, age):
        self.name = name
        self.sex = sex
        self.age = age
    def eat(self):
        print('%s正在吃饭' % (self.name))
class Person(Animal):
    def __init__(self, skin, name, sex, age):   # 定义人类的皮肤属性
        self.skin = skin
        super(Person, self).__init__(name, sex, age)  # 引用父类封装的属性
class Dog(Animal):
    def __init__(self, hair, name, sex, age):   # 定义狗的毛色属性
        self.hair = hair
        super(Dog, self).__init__(name, sex, age)   # 引用父类封装的属性
d3 = Dog('白色', '哈士奇', '', 2)
d3.eat()
'''
2,
class A:
    def func(self):
        print('in A')

class B:
    def func(self):
        print('in B')

class C(A,B):
    def func(self):
        print('in C')
可以改动上上面代码,完成下列需求:
对C类实例化一个对象产生一个c1,然后c1.func()
1, 让其执行C类中的func
2,让其执行A类中的func
3,让其执行B类中的func
4,让其既执行C类中的func,又执行A类中的func
5,让其既执行C类中的func,又执行B类中的func

'''

# 01, 让其执行C类中的func
class A:
    def func(self):
        print('in A')

class B:
    def func(self):
        print('in B')

class C(A,B):
    def func(self):
        print('in C')
c1 = C()
c1.func()
print(C.__mro__)  # 查看类执行先后的顺序。

# 02,让其执行A类中的func
class A:
    def func(self):
        print('in A')

class B:
    def func(self):
        print('in B')

class C(A,B):
    def func(self):
        super(C, self).func()  # 通过该行代码,让其执行A类中的func。
c1 = C()
c1.func()
print(C.__mro__)

# 03 让其执行B类中的func
class A:
    def func(self):
        print('in A')

class B:
    def func(self):
        print('in B')

class C(B):
    def func(self):
        super().func()

c1 = C()
c1.func()

# 04 让其既执行C类中的func,又执行A类中的func
class A:
    def func(self):
        print('in A')

class B:
    def func(self):
        print('in B')

class C(A,B):
    def func(self):
        print('in C')
        super(C, self).func()  # 通过该行代码,让其执行A类中的func。
c1 = C()
c1.func()
print(C.__mro__)

# 05 让其既执行C类中的func,又执行B类中的func
class A:
    def func(self):
        print('in A')

class B:
    def func(self):
        print('in B')

class C(A,B):
    def func(self):
        print('in C')
        super(A, self).func() # 通过该行代码,让其执行A类中的func。
c1 = C()
c1.func()
print(C.__mro__)

# 3,下面代码执行结果是什么?为什么?
class Parent:
    def func(self):
        print('in Parent func')

    def __init__(self):
        self.func()

class Son(Parent):
    def func(self):
        print('in Son func')

son1 = Son()

# 输出结果:in Son func
'''
原因:由于在继承的时候,执行的顺序是先在子类/派生类中的方法/变量。,在执行父类(超类)中的方法/变量。本题中子类中包含
func函数,所以会先执行子类中的函数。
'''

# 4
class A:
    name = []

p1 = A()
p2 = A()
p1.name.append(1)
# p1.name,p2.name,A.name 分别是什么?
print(p1.name)   # [1] ,因为name是静态变量,开辟的空间是唯一的。
print(p2.name)   # [1] ,因为name是静态变量,开辟的空间是唯一的。
print(A.name)    # [1] ,因为name是静态变量,开辟的空间是唯一的。

p1.age = 12
# p1.age,p2.age,A.age 分别又是什么?为什么?
print(p1.age)  # 12
print(p2.age)  # 报错,age是p1的特有属性
print(A.age)   # 报错,age是p1的特有属性