python day06 练习题

'''
1、简述类、对象、实例化、实例是分别是什么?

类是具有相同特征和功能的一类事物.
对象是通过类来创建的具体的个体. 每个对象都有自己的独立的名称空间.
对象和实例是具体的某一事物.
实例化是对象/实例创建的过程.
'''

''''
2、请简述面向对象三大特性?

(1).封装:    
        隐藏对象的属性和实现细节,对外提供公共的访问方式.
        作用:将业务和实现逻辑解耦;提高了代码的易用性/复用性,增强了安全性.
        原则:如果可以不对外提供,就都隐藏起来;属性都隐藏,仅提供对外调用方法.
(2).继承:
        就是继承的类直接拥有被继承类的属性而不需要在自己的类体中重新再写一遍,其中被继承的类叫做父类、基类,继承的类叫
        做派生类、子类。      
(3).多态:
        同一类事物的多种形态.鸭子模型
'''

'''
3、说说python中所说的封装是什么意思?

封装:    
    隐藏对象的属性和实现细节,对外提供公共的访问方式.
    作用:将业务和实现逻辑解耦;提高了代码的易用性/复用性,增强了安全性.
    原则:如果可以不对外提供,就都隐藏起来;属性都隐藏,仅提供对外调用方法.
'''

'''
4、多态是怎么回事?在python中是如何体现的?

多态就是不同的对象可以调用相同的方法,然后得到不同的结果.
在python中处处体现着多态,比如不管你是列表还是字符串还是数字都可以使用+和*。
'''

'''
5、说说面向对象中“私有”的概念以及应用?

私有属性和方法,只有类内部的方法可以访问.
python中所说的封装是就是把类中的属性和方法定义为私有的,方法就是在属性名或方法名前加双下划线,而一旦这样定义了属性或
方法名后,python会自动将其转换为_类名__属性名(方法名)的格式,在类的内部调用还是用双下划线加属性名或方法名,在类的
外部调用就要用_类名__属性名(方法名)。父类的私有属性和方法,子类无法对其进行重写(覆盖).
'''

'''
6、在面向对象中有一些被装饰器装饰的方法,先说说有哪些装饰器,再说说这些装饰器的作用,以及装饰之后的效果

装饰器: property/classmethod/staticmethod
property把一个方法编程了一个属性,类.属性名.
classmethod类的绑定方法,自动将类名作为第一个参数传递.
staticmethod静态方法,不会自动传递参数,就是一个普通的函数
'''

'''
7、请说明新式类和经典类的区别,至少两个。

新式类都从object继承,经典类不需要。
新式类以广度优先,经典类以深度优先.
'''

'''
8、请说出上面一段代码的输出并解释原因?
class Foo:
  def func(self):
    print('in father')
class Son(Foo):
  def func(self):
    print('in son')
s = Son()
s.func()

执行结果: in son
原因: 子类重新(覆盖)了父类的func方法.
'''


'''
1. 类、对象、实例例、实例例化有什什么关系 ?

类是具有相同特征和功能的一类事物.
对象是通过类来创建的具体的个体. 每个对象都有自己的独立的名称空间.
对象和实例是具体的某一事物.
实例化是对象/实例创建的过程.
'''

'''
2. 类属性和实例例属性有什么区别?

类属性是通过装饰器@property, property把一个方法编程了一个属性.如下类Person:
    类变量: country  调用方法: 尽量使用类名.变量,也可以对象.变量
    类方法: func2    调用方法: 尽量使用类名.方法() 会自动将类名作为第一个参数进行传递, 
                                也可以使用对象.方法() 调用,但会将对象的类名作为第一个参数自动传递过去.
    类属性: age      调用方法: 类名.变量  或 对象.变量
    
实例属性是实例类的时候,自动初始化的属性,是定义在__init__方法内的变量.
    实例属性: name和birthYear  调用方法: 对象.属性 

'''
# import time
# class Person():
#     country = "中国"
#     def __init__(self, name, birthYear):
#         self.name = name
#         self.birthYear = birthYear
#     def func(self):
#         print("func")
#     @classmethod    # 类方法
#     def func2(cls):
#         print("func2: %s" % cls.country)
#     @staticmethod   # 静态方法
#     def func3():
#         print("func3")
#     @property   # 属性
#     def age(self):
#         return int(time.strftime("%Y")) - self.birthYear
#
# p = Person("lily", 1999)    # 创建一个对象p
# p2 = Person("alex", 1989)   # 创建一个对象p2
# print(p.__dict__)   # 对象/实例的属性
# print(p.name, p.age, p2.name, p2.age)
#
# Person.name = "lucy"
# Person.age = 28     # 修改类的属性
#
# print(p.name, p.age, p2.name, p2.age)

'''
3. 写个实际使用类属性的场景代码
'''
# import math
# class Circle():   # 圆
#     def __init__(self, radius):     # 圆的半径
#         self.radius = radius
#     @property   # 属性
#     def area(self):     # 圆的面积
#         return math.pi * self.radius ** 2
#     @property   # 属性
#     def perimeter(self):    # 圆的周长
#         return 2 * math.pi * self.radius
#
# c = Circle(2.8)     # 实例化一个类,创建一个对象c
# print(float(format(c.area, ".2f")))     # 面积保留2位小数
# print(float(format(c.perimeter, ".2f")))    # 周长保留2位小数

'''
4.自己设计场景并写个封装的代码
'''
# class Person():
#     def __init__(self, name, permission=False):
#         self.__name = name
#         self.permission = permission
#     @property   # 查询
#     def name(self):
#         return self.__name
#     @name.setter    # 修改
#     def name(self, name):
#         self.__name = name
#     @name.deleter   # 删除
#     def name(self):
#         if not self.permission:
#             raise PermissionError("不允许的操作.")
#         del self.__name
#
# p = Person("lily")  # 创建一个对象p
# print(p.name)   # 查看
# p.name = "lucy"  # 修改
# print(p.name)   # 查看
# p.permission = True  # 修改实例属性
# del p.name  # 删除

'''
5.自己设计场景并写个继承的代码
'''
# class Father():
#     def moeny(self):
#         print("money from Father.")
#
# class GanDie():
#     def moeny(self):
#         print("money from GanDie.")
#
# class Mother():
#     def moeny(self):
#         print("money from Mother.")
#
# class Son(Father, GanDie, Mother):  # 子类继承Father, GanDie, Mother三个父类
#     pass
#
# s = Son()   # 创建一个对象s
# print(Son.mro())    # Method Resolution Order 查找顺序
# s.moeny()

'''
6.自己设计场景并写一个多态的代码

多态:同一类事物的多种形态.
'''
# class Animal():
#     def talk(self):
#         print("说话.")
# class People(Animal):
#     def talk(self):
#         print("say hello.")
#
# class Pig(Animal):
#     def talk(self):
#         print("哼哼哼.")
#
# class Dog(Animal):
#     def talk(self):
#         print("汪汪汪.")
#
# peo1 = People()   # 创建一个对象peo1
# pig1 = Pig()    # 创建一个对象pig1
# dog1 = Dog()    # 创建一个对象dog1
#
# peo1.talk()
# pig1.talk()
# dog1.talk()

'''
7.自己设计场景写个类组合的关系代码, 比如 cs游戏, 人是一个类,枪是一个类,人可以选择不同的枪.

组合解决代码冗余问题,组合反映的是一种什么有什么的关系.
'''
# class Person():
#     def __init__(self, name, age):
#         self.name = name
#         self.age = age
#     def play(self, obj):
#         print("%s喜欢使用的枪: %s" % (self.name, obj.name))
#
# class Gun():
#     def __init__(self, name):
#         self.name = name
#
# per1 = Person("lily", 18)   # 创建一个对象per1
# gun1 = Gun("b31")   # 创建一个对象gun1
# gun2 = Gun("MP5")   # # 创建一个对象gun1
# per1.play(gun1)
# per1.play(gun2)
原文地址:https://www.cnblogs.com/lilyxiaoyy/p/10913084.html