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可以将函数属性转化为数据属性
-
class Dog(object):
-
def __init__(self,name):
-
self.name = name
-
@property
-
def eat(self):
-
print(" %s is eating" %self.name)
-
d = Dog("ChenRonghua")
-
d.eat()
报错内容:
-
Traceback (most recent call last):
-
File "D:/py.py", line 27, in <module>
-
d.eat()
-
TypeError: 'NoneType' object is not callable
改正如下:
-
class Dog(object):
-
def __init__(self,name):
-
self.name = name
-
@property
-
def eat(self):
-
print(" %s is eating" %self.name)
-
d = Dog("ChenRonghua")
-
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