面向对象编程设计练习题(1)

1.面向对象三大特性,各有什么用处,说说你的理解
  继承
继承指的是类与类之间的关系,是一种什么“是”什么的关系,继承的功能之一就是用来解决代码重用问题继承是一种创建新类的方式
在python中,新建的类可以继承一个或多个父类,父类又称为基类或超类,新建的类称为派生类或子类
  封装 :将数据隐藏起来然后对外提供操作该数据的接口,然后我们可以在接口附加上对该数据操作的限制,以此完成对数据属性操作的严格控制.
封装方法另一个目的是隔离复杂度
  
  多态 :
实现接口重用
一个接口,多种实现 。增加了程序的灵活性,以不变应万变,不论对象千变万化,使用者都是同一种形式去调用,如func(animal)。
增加了程序额可扩展性,通过继承animal类创建了一个新的类,使用者无需更改自己的代码,还是用func(animal)去调用

2.
类的属性和对象的属性有什么区别?
   
 
  类的属性分为数据属性和函数属性。类的数据属性时所有对象共享的,类的函数属性是绑定给对象用的,称为绑定到对象的方法。
对象的属性可能来自类定义,即类属性。(类定义自身、类定义继承两种途径)对象的属性还可能是该对象实例定义的,即对象属性。

3.
面向过程编程与面向对象编程的区别与应用场景?
  
  面向过程:
基本设计思路就是把这个大的问题分解成很多个小问题或子过程,这些子过程在执行的过程中继续分解,直到小问题足够简单到可以在一个小步骤范围内解决。
优点是:复杂的问题流程化,进而简单化 缺点是:扩展性极差。面向过程的程序设计思想一般用于那些功能一旦实现之后就很少需要改变的场景  
  面向对象:
面向对象编程是利用“类”和“对象”来创建各种模型来实现对真实世界的描述。与面向过程机械式的思维方式形成鲜明对比,面向对象更加注重对现实世界而非流程的模拟,是一种“上帝式”的思维方式。

优点:可扩展型高,可维护性高,使程序更加容易扩展和易更改,使开发效率变的更高,
基于面向对象的程序可以使它人更加容易理解你的代码逻辑,从而使团队开发变得更从容缺点:编程的复杂度远高于面向过程,不了解面向对象而立即上手并基于它设计程序,极容易出现过度设计的问题,而且在一些扩展性要求低的场景使用面向对象会徒增编程难度。
应用于需求经常变化的软件中

4.类和对象在内存中是如何保存的
  以字典的方式保存,代码在类定义阶段便会执行,因而会产生新的名称空间,用来存放类的变量名和函数名,可以通过__dict__查看。
类以及类中的方法在内存中只有一份,而根据类创建的每一个对象都在内存中需要存一份

5.
什么是绑定到对象的方法、绑定到类的方法、解除绑定的函数、如何定义,如何调用,给谁用?有什么特性
  绑定到对象的方法:没有被任何装饰器装饰的方法。自动将对象当作第一个参数传入
  绑定到类的方法:用classmethod装饰器装饰的方法。自动将类当作第一个参数传入
  非绑定方法:在类内部用staticmethod装饰的函数即非绑定方法,就是普通函数,statimethod不与类或对象绑定,谁都可以调用,没有自动传值效果

6.
使用实例进行 获取、设置、删除 数据, 分别会触发类的什么私有方法
  
class A(object):
    def __setitem__(self, key, value):
        self.__dict__[key] = value
    def __getitem__(self, item):
        return self.__dict__[item]
    def __delitem__(self, key):
        del self.__dict__[key]


a = A()
a["key"] = "val"
print(a.__dict__)
b = a["key"]
print(b)
del a["key"]
print(a.__dict__)

7.python中经典类和新式类的区别

在python2中,没有显式的继承object类的类,以及该类的子类,都是经典类
在python2中,显式地声明继承object的类,以及该类的子类,都是新式类
在python3中,无论是否继承object,都默认继承object,即python3中所有类均为新式类
object是所有python类的基类,它提供了一些常见方法(如__str__)的实现
经典类的属性查找的方式是是深度优先,新式类的查找方式是广度优先

8.如下示例, 请用面向对象的形式优化以下代码
def exc1(host,port,db,charset,sql):
       conn=connect(host,port,db,charset)
       conn.execute(sql)
       return xxx
 def exc2(host,port,db,charset,proc_name)
       conn=connect(host,port,db,charset)
       conn.call_proc(sql)
       return xxx
   # 每次调用都需要重复传入一堆参数
   exc1('127.0.0.1',3306,'db1','utf8','select * from tb1;')
   exc2('127.0.0.1',3306,'db1','utf8','存储过程的名字')
题目代码
class MySQLHandler:
    def __init__(self,host,port,db,charset='utf8'):
        self.host=host
        self.port=port
        self.db=db
        self.charset=charset
        self.conn=connect(self.host,self.port,self.db,self.charset)
    def exc1(self,sql):
        return self.conn.execute(sql)

    def exc2(self,sql):
        return self.conn.call_proc(sql)


obj=MySQLHandler('127.0.0.1',3306,'db1')
obj.exc1('select * from tb1;')
obj.exc2('存储过程的名字')

9.示例1, 现有如下代码, 会输出什么

class People(object):
      __name = "luffy"
      __age = 18

  p1 = People()
  print(p1.__name, p1.__age)

会报错,因为name和age都隐藏了,AttributeError: 'People' object has no attribute '__name'

10.示例2, 现有如下代码, 会输出什么
class People(object):

   def __init__(self):
       print("__init__")

   def __new__(cls, *args, **kwargs):
       print("__new__")
       return object.__new__(cls, *args, **kwargs)

People()

# 输出:
__new__
__init__

#解析:  new: 对象的创建,是一个静态方法,第一个参数是cls。
         init : 对象的初始化, 是一个实例方法,第一个参数是self。
    先有创建,才有初始化。即先new,而后init


 


 
 
 

 

 










原文地址:https://www.cnblogs.com/lys666/p/10000341.html