# 特性1.继承;2.多态;3.封装
1.面向对象三大特性,各有什么用处,说说你的理解。
# 类的属性有数据属性和函数属性,类的数据属性是所有对象共享的,类的函数属性是绑定给对象用的
2.类的属性和对象的属性有什么区别?
# 1.面向过程:复杂问题流程化进而简单化,但是代码扩展性查,不易维护
3.面向过程编程与面向对象编程的区别与应用场景
类和对象的属性都是用字典的形式保存的
4.类和对象在内存中是如何保存的
# 绑定到对象的定义:绑定对象的方法,类去访问自己的函数属性的时候就是一个普通的函数,没有自动调用的方式
"""
class Foo:
def bound(self):
print('from Foo')
f = Foo()
f.bound()
"""
"""
class Foo:
@classmethod
def bound(cls):
print('%s被绑定到类的函数'%cls)
f = Foo()
"""
"""
class Foo:
def __init__(self, name):
self.name = name
def tell(self):
print('名字是%s' %self.name)
@staticmethod
def func1(x,y):#self? 不存在的!
return x+y
f = Foo('panda')
print(Foo.func1(1,2))
print(f.func1(1,3))
"""
5. 什么是绑定到对象的方法、绑定到类的方法、解除绑定的函数、如何定义,如何调用,给谁用?有什么特性
class A:
def __getitem__(self, item):
return self.__dict__.get(item)
def __setitem__(self, key, value):
self.__dict__[key] = value
def __delitem__(self, key):
del self.__dict__[key]
a = A()
a["key"] = "val"
print(a.__dict__)
print(a["key"])
del a["key"]
print(a.__dict__)
6.使用实例进行 获取、设置、删除 数据, 分别会触发类的什么私有方法
# python中的经典类:只出现在python2中,经典类的特征:没有继承object的类以及它的子类都称为经典类
7.python中经典类和新式类的区别
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 Mysql:
def __init__(self):
self.host = '127.0.0.1'
self.port = 3306
self.db = 'db1'
self.charset = 'utf-8'
def connect(self):
return '地址%s 端口号%s 数据库名称%s 字符编码%s' % (self.host, self.port, self.db, self.charset)
def execute(self,sql):
return 'SQL语句%s已经执行' % sql
def call\_proc(self,sql):
return '已保存%s文件'%sql
sq = Mysql()
print(sq.connect())
print(sq.execute('select * from '))
print(sq.call_proc('test.txt'))
9.示例1, 现有如下代码, 会输出什么
class People(object):
__name = "luffy"
__age = 18
p1 = People()
print(p1.__name, p1.__age)
# 会报错,在类的执行阶段就会加载代码了,然后看到__name这种代码就会执行封装,变形以后隐藏,实例化的对象不使用特殊方法(a._A__N)是不能执行的
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__
11.请简单解释Python中 staticmethod(静态方法)和 classmethod(类方法), 并分别补充代码执行下列方法。
class A(object):
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()
A.class_foo('id')
a.static_foo('panda')
# staticmethod(静态方法)就是将类中的函数变成一个普通函数,做成了函数工具,但是不会自动传参,需要多少参数就传多少参数
12.请执行以下代码,解释错误原因,并修正错误
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是将类中的函数属性伪装成数据属性(不能传递参数),调用的时候直接就可以使用函数的方式就像,不需要加括号
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)
13.下面这段代码的输出结果将是什么?请解释。
14.多重继承的执行顺序,请解答以下输出结果是什么?并解释
class A(object):
def __init__(self):
print('A')
super(A, self).__init__()
class B(object):
def __init__(self):
print('B')
super(B, self).__init__()
class C(A):
def __init__(self):
print('C')
super(C, self).__init__()
class D(A):
def __init__(self):
print('D')
super(D, self).__init__()
class E(B, C):
def __init__(self):
print('E')
super(E, self).__init__()
class F(C, B, D):
def __init__(self):
print('F')
super(F, self).__init__()
class G(D, B):
def __init__(self):
print('G')
super(G, self).__init__()
if __name__ == '__main__':
g = G()
f = F()
15.请编写一段符合多态特性的代码.
import abc
class People(metaclass=abc.ABCMeta):
def __init__(self,name):
self.name = name
@abc.abstractmethod
def walk(self):
pass
class Man(People):
def walk(self):
print('%s is walking' % self.name)
class Women(People):
def walk(self):
print('%s is running' % self.name)
pa = Man('panda')
pa.walk()
pa1 = Women('girl')
pa1.walk()
16.很多同学都是学会了面向对象的语法,却依然写不出面向对象的程序,原因是什么呢?原因就是因为你还没掌握一门面向对象设计利器,即领域建模,请解释下什么是领域建模,以及如何通过其设计面向对象的程序?
# 领域建模的三字经方法:找名词、加属性、连关系>>http://www.cnblogs.com/alex3714/articles/5188179.html >>给你个眼神,自己体会
17.请写一个小游戏,人狗大站,2个角色,人和狗,游戏开始后,生成2个人,3条狗,互相混战,人被狗咬了会掉血,狗被人打了也掉血,狗和人的攻击力,具备的功能都不一样。
# 注意,请按题14领域建模的方式来设计类。
class Animal:
def __init__(self,name ,health,attack):
self.name = name
self.health = health
self.attack = attack
class People(Animal):
def hit(self,enemy):
enemy.health -= self.attack
class Dog(Animal):
def bit(self,enemy):
enemy.health -= self.attack
P1 = People('panda',100,10)
P2 = People('zombie',120,10)
D1 = Dog('small_black',50,5)
D2 = Dog('big_yellow',60,6)
D3 = Dog('big_white',40,8)
P1.hit(D1)
print(D1.health)
18.编写程序, 在元类中控制把自定义类的数据属性都变成大写.
class MyDef(type):
def __new__(cls, class_name, class_attr, class_dic):
upper_data = {}
for k,v in class_dic.items():
if not callable(v) and not k.startswith('__'):
upper_data[k.upper()] = v
else:
upper_data[k] = v
return type.__new__(cls, class_name, class_attr, upper_data)
class People(metaclass=MyDef):
time = 'now'
work = 'weekends'
print(People.__dict__)
20.编写程序, 编写一个学生类, 要求有一个计数器的属性, 统计总共实例化了多少个学生.
class Student:
count = 0
def __init__(self):
Student.count += 1
@classmethod
def counts(cls):
return cls.count
s1 = Student()
print(Student.counts())
s2 = Student()
print(Student.counts())
21. 编写程序, A 继承了 B, 俩个类都实现了 handle 方法, 在 A 中的 handle 方法中调用 B 的 handle 方法
class B:
def handle(self):
print('form B')
class A(B):
def handle(self):
super().handle()
a = A()
a.handle()
手机扫一扫
移动阅读更方便
你可能感兴趣的文章