一、面向对象编程
1.面向对象三大特性,各有什么用处,说说你的理解
封装:根据职责将属性和方法封装到一个抽象的类中,定义类的准则
继承:实现代码的重用,相同的代码不需要重复的编写,子类直接继承父类的所有属性和方法即可
多态:就是不同的子类对象调用相同的方法,产生不同的执行结果
2.面向过程编程与面向对象编程的区别?
面向过程:把一个目标实现的过程分成很多步骤,利用多个函数一步一步实现
面向对象:把一个目标的实现分成很多模块,每个模块都有自己的功能,通过模块整合从而实现目标
3.python中经典类和新式类的区别?
旧式类:也称经典类,使用经典类时就不会自动调用object类
新式类:自动调用object类
python3.几版本后可以自动调用基类(object类)
4.请简单解释Python中 staticmethod(静态方法)和 classmethod(类方法)
静态方法就是直接通过类名.方法名来调用,使用@staticmethod来当头文件
类方法需要访问类属性,用@classmethod来当头文件,也通过类名.方法名来调用
区别:在类方法内部可以直接访问类属性或者调用其他类方法
二、实例
一个简单的面向对象编程:
class Dog():
def eat(self):
print '小狗爱吃肉'
def play(self):
print '小狗爱玩耍'
# 将类转换到对象
dou = Dog()
dou.eat()
dou.play()
执行结果:
class Dog():
def eat(self):
print '小狗爱吃肉'
def play(self):
print '小狗爱玩耍'
# 创建狗对象
doudou = Dog()
doudou.name = 'wangcai' # 单独的赋值属性
doudou.eat()
doudou.play()
print wangcai # 会输出wangcai的引用
addr = id(doudou)
# %x:大印格式为16进制
print '%x' % addr
# %d:大印格式为10进制
print '%d' % addr
# 再创建一个狗对象,一个类可以创建多个对象
lazy_dog = Dog()
lazy_dog.name = 'lala'
lazy_dog.eat()
lazy_dog.play()
print lazy_dog
lazy_dog2 = lazy_dog # 这个命令表示两个对象是相同的
print lazy_dog2
执行结果:
# 创建狗对象
wangcai = Dog()
#wangcai.name = 'wangcai' # 单独的赋值属性
wangcai.eat()
wangcai.play()
wangcai.name = 'wangcai'
# 如果在运行中没有找到属性,程序会报错
eg1:
class Person:
def __init__(self, new_name, weight):
self.name = new_name
self.weight = weight
def __str__(self):
return 'my name is %s weight is %.2f' % (self.name, self.weight)
def run(self):
print '%s likes to run ' % self.name
# 在对象的方法内部,是可以直接访问对象的属性
self.weight -= 0.5
def eat(self):
print '%s likes to eat ' % self.name
self.weight += 1
tom = Person('tom', 75.0)
tom.run()
tom.eat()
print tom
lily = Person('lily', 50.0)
lily.run()
lily.eat()
print lily
执行结果:
eg2:摆放家具
1.房子有户型,总面积和家具名称列表
2.家具有名字和占地面积,其中
床:占4平米
衣柜:占2平米
餐桌:占1.5平米
3.将以上三间家具添加到房子中
4.打印房子时,要求输出:户型,总面积,剩余面积,家具名称列表
# 先定义家具类
class HouseItem():
def __init__(self, name, area):
self.name = name
self.area = area
def __str__(self):
return '[%s] 占地 %.2f ' % (self.name, self.area)
# 定义房子类
class House():
def __init__(self, house_type, area):
self.house_type = house_type
self.area = area
# 剩余面积
self.free_area = area
# 家具列表名称
self.item_list = []
def __str__(self):
return '户型:%s\n总面积:%.2f[剩余:%.2f]\n家具列表:%s' \
% (self.house_type, self.area, self.free_area, self.item_list)
def add_item(self, item):
print '要添加%s' % item
# 1.判断家具的面积
if item.area > self.free_area:
print '%s 面积过大,无法放置' % item
# 如果不满足,下方代码不执行
return
# 2.将家具的名称添加至列表中
self.item_list.append(item.name)
# 3.计算剩余面积
self.free_area -= item.area
# 创建家具对象
bed = HouseItem('bed', 4)
print bed
chest = HouseItem('chest', 2)
print chest
table = HouseItem('table', 1.5)
print table
# 创建房子对象
my_home = House('三室两厅', 100)
# 添加家具
my_home.add_item(bed)
my_home.add_item(chest)
my_home.add_item(table)
print my_home
执行结果:
eg3:士兵开枪
1.士兵瑞恩有一把AK47
2.士兵可以开火
3.枪能够发射子弹(减少子弹数量 )
4.枪能够装填子弹 (增加子弹的数量)