pythonn 面向对象总结

1、面向对象三大特性,各有什么用处,说说你的理解。

  • 继承:解决代码的重用问题
  • 多态:多态性,可以在不考虑对象类型的情况下直接使用对象
  • 封装:明确区分内外,控制外部对隐藏属性的操作行为,隔离复杂度

2、类的属性和对象的属性有什么区别?

  • 类的属性:它包含数据属性和函数属性,数据属性是所有对象共有的,函数属性是绑定对象使用的
  • 对象属性:对象是类的实例化

3、面向过程编程与面向对象编程的区别与应用场景?

  • 面向过程:复杂的问题流程化,简单化
  • 应用场景:不再需要扩展,监测脚本,自动部署脚本,软件解压安装
  • 面向对象:特征与技能的结合 一切皆为对象
  • 应用场景:用户需求经常改变,互联网应用,游戏开发,企业内部应用

4、类和对象在内存中是如何保存的。

  • 类和对象在内存中是以字典的形式保存。(可以用__dict__查看)

5、使用实例进行 获取、设置、删除 数据, 分别会触发类的什么私有方法有什么特性

      class A(object):
               pass

      a = A()
      a["key"] = "value"
      a = a["key"]
      del a["key"]

6、python中经典类和新式类的区别

  • 经典类:python2 没有继承object的类,以及它的子类都称为经典类  -----》深度优先
  • 新式类:python3继承object的类,以及它的子类都称为新式类--------》广度优先

7、如下示例, 请用面向对象的形式优化以下代码

"""
1、在没有学习类这个概念时,数据与功能是分离的
def exc1(host,port,db,charset):     
    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="utf-8"):
        self.host =host
        self.port =port
        self.db = db
        self.charset = charset
        self.conn = connect(self.host,self.port,self.db,self.charset)


    def ecx1(self,sql):
        return self.conn.execute(sql)

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


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

8、请简单解释Python中 staticmethod(静态方法)和 classmethod(类方法), 并分别补充代码执行下列方法

  • 静态方法(staticmethod):非绑定方法,类和对象都可以调用
  • 类方法(classmethod):绑定给类的方法啊,类调用
class A(object):
    def __init__(self, name):
        self.name = name

    def foo(self, x):
        print("executing foo(%s, %s)" % (self, x))

    @classmethod
    def class_foo(cls, x):
        print("executing class_foo(%s, %s)" % (cls, x))

    @staticmethod
    def static_foo(x):
        print("executing static_foo(%s)" % (x))


a = A('alice')
a.foo('alice')
A.class_foo('alice')
a.static_foo('alice')
A.static_foo('alice')
'''
executing foo(<__main__.A object at 0x000002A5FED12AC8>, alice)
executing class_foo(<class '__main__.A'>, alice)
executing static_foo(alice)
executing static_foo(alice)
'''

 

12,请执行以下代码,解释错误原因,并修正错误。

错误原因:@property可以将函数属性转化为数据属性

 
  1. class Dog(object):

  2.  
  3. def __init__(self,name):

  4. self.name = name

  5.  
  6. @property

  7. def eat(self):

  8. print(" %s is eating" %self.name)

  9.  
  10. d = Dog("ChenRonghua")

  11. d.eat()

报错内容:

 
  1. Traceback (most recent call last):

  2. File "D:/py.py", line 27, in <module>

  3. d.eat()

  4. TypeError: 'NoneType' object is not callable

改正如下:

 
  1. class Dog(object):

  2.  
  3. def __init__(self,name):

  4. self.name = name

  5.  
  6. @property

  7. def eat(self):

  8. print(" %s is eating" %self.name)

  9.  
  10. d = Dog("ChenRonghua")

  11. d.eat

因为有了property,用户就可以直接输入得到结果,对于使用者来说,感知不到其属性,这就是使用property的方便之处,此方法必须有一个返回值。return 或者print都可以。

为什么要用property?

一个类的函数定义成特性以后,对象再去使用的时候obj.name,根本无法察觉自己的name是执行了一个函数然后计算出来的,这种特性的使用方式 遵循了统一访问的原则

13,下面这段代码的输出结果将是什么?请解释。

class Parent(object):
   x = 1

class Child1(Parent):
   pass

class Child2(Parent):
   pass

print(Parent.x, Child1.x, Child2.x)
Child1.x = 2
print(Parent.x, Child1.x, Child2.x)
Parent.x = 3
print(Parent.x, Child1.x, Child2.x)

# 1 1 1 继承自父类的类属性x,所以都一样,指向同一块内存地址
# 1 2 1 更改Child1,Child1的x指向了新的内存地址
# 3 2 3 更改Parent,Parent的x指向了新的内存地址

 

14,多重继承的执行顺序,请解答以下输出结果是什么?并解释。

super()表示的是 子类的mro()列表中的下一个
    print
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值