-摘自张磊同学博客.

面向对象

1.请简述类、对象、实例化、实例这些名词的含义:

#类 : 是对具有相同属性和相似行为的一类事物的抽象
#对象: 是一个具有具体属性值的类的实例化
#实例化 : 从一个抽象的类 变成(产生) 一个具体对象的过程
#实例: 就是对象

2.面向对象的三大特性是什么?

#继承 多态 封装

3.什么是方法?类中可以定义哪几种方法?

# 在类中的函数就是方法,描述的是一类事物的行为
# 方法 类方法 静态方法 私有方法 内置方法 属性方法(@property)

4.什么是属性?类中可以定义哪几种属性?

# 类 和 对象所拥有的的具体的"值"指标
# 私有属性 静态属性 动态属性(方法) 对象属性

5.请简述类方法和静态方法有哪些区别?

# 装饰器不同 @staticmethod @classmethod
# 类方法中有一个默认的参数cls,而静态方法没有

6.请简述新式类和经典类的区别?

#在py3里 所有的多继承问题 都符合 广度优先算法
#python3中的所有类 都默认继承object #如果一个类 继承了object 这个类就被称为新式类
#没有继承object类 就被称为经典类 #深度优先 广度优先 都是一种遍历算法,把这个图中所有的项都走一遍,且不会重复 #经典类 遵循 深度优先算法 且没有mro方法 python2
#新式类 遵循 广度优先算法 有mro方法 py2 py3
#py3 super
#单继承中 super就是找父类
#多继承 super寻找的轨迹是根据mro(广度优先)顺序的

7.有一个类定义:

class Person:
  def __init__(self,name,age):
    self.name = name
    self.age = age

1)初始化10个不同的对象

p1=Person('a',10)
p2=Person('b',11)
p3=Person('c',12)
p4=Person('d',13)
p5=Person('e',14)
p6=Person('f',15)
p7=Person('g',16)
p8=Person('h',17)
p9=Person('i',18)
p10=Person('j',19)

2)求最高age的对象的name

l=[p1,p2,p3,p4,p5,p6,p7,p8,p9,p10]#创建一个10个对象的列表
num=0#定义num=0
for i in l:#循环列表
  if i.age>num:#如果对象的age属性大于0
    num=i.age#则num=这个年龄
print(num)

8. 模拟cs游戏
人物角色分为警察和匪徒两种,定义成两个类

所有的警察的角色都是police
每个警察都有自己独有名字,生命值,武器,性别
每个都可以开枪攻击敌人,切攻击目标不能是police

所有的警察的角色都是terrorist
每个匪徒都有自己独有名字,生命值,武器,性别
每个都可以开枪攻击敌人,切攻击目标不能是terrorist

class Police:#定义一个警察类
  def __init__(self,name,gande,wuqi,value=100,):#初始化对象传入参数
    self.name=name#名字属性
    self.gande=gande#伙,属性
    self.wuqi=wuqi#武器属性
    self.value=value#生命值属性
  def ataik(self,name):#定义攻击方式
    if not isinstance(name,Police):#如果不是警察
      name.value-=10#坏人的血值减等于10
    else:
      print('友军')#否则是友军
class Terrorist:#定义一个匪徒的类
  def __init__(self, name, gande, wuqi, value=100, ):#初始化对象
    self.name = name#名字属性
    self.gande = gande#伙属性
    self.wuqi = wuqi#武器属性
    self.value = value#生命值属性   def ataik(self, name):#攻击方式
    if not isinstance(name, Terrorist):如果名字不是匪徒的类
    name.value -= 10#警察的血值-=10
  else:
    print('友军')#否则是友军

9. 实例化一个警察,一个匪徒,警察攻击匪徒,匪徒掉血

p=Police('cris','man','m4a1')#实例化一个警察

t=Terrorist('alex','man','ak47')#实例化一个匪徒

p.ataik(t)#警察攻击匪徒
print(t.value)#显示匪徒的血值

10. 提取警察类和匪徒类相似之处定义成一个父类,使用继承的方式减少代码重复

class pepo:#定义一个人的类
def __init__(self, name, gande, wuqi, value=100, ):#初始化方法
self.name = name#name属性
self.gande = gande#伙属性
self.wuqi = wuqi#武器属性
self.value = value#血值属性 class Police(pepo):#定义一个警察,继承人的类属性
def ataik(self, name):#定义一个攻击方式
if not isinstance(name,Police):#如果不是警察的类
name.value-=10#匪徒的血值减等于10
else:
print('友军')#否则是友军 class Terrorist(pepo):#定义一个匪徒
def ataik(self, name):#攻击方式
if not isinstance(name,Terrorist):#如果不是匪徒的类
name.value-=10#警察生命值减等于10
else:
print('友军') #否则是友军 

思考题:
有一个类的init方法如下:
class Person:
def __init__(self,name,age,sex,weight):
self.name = name
self.sex = sex
self.age = age
self.weight = weight
假设有100个person的对象,
若两个对象的obj1,obj2的name和sex属性相同
即obj1.name==obj2.name and obj1.sex==obj2.sex
我们认为两个对象为同一个对象,已知一个列表中的100个对象,对这100个对象进行去重。
提示:
重写Person类重的两个内置方法

class Person:#定义一个类
def __init__(self,name,age,sex): #初始化属性
self.name = name #对象的name属性
self.age = age #对象的age属性
self.sex = sex #对象的sex属性
def __hash__(self): #定义哈希方法
return hash('%s%s'%(self.name,self.sex)) #返回hash'self.name,self.sex'的值
def __eq__(self, other): #定义一个eq方法
if self.name == other.name and \
self.sex == other.sex: #如果对象属性等于
return True
p_lst = [] #定义个空列表
for i in range(100):#打印0到99
p_lst.append(Person('egon',i,'male'))#p_lst列表添加Person('egon',i,'male')
p_lst.append(Person('alex',i,'male'))#p_lst列表添加Person('alex',i,'male')
p_lst.append(Person('yuan',i,'male'))#p_lst列表添加Person('yuan',i,'male')
print(p_lst)
# print(set(p_lst)) # 报错不可hash 完成了__hash__
# hash是否相等 __hash__
# 值是否相等 __eq__
# a==b
# 收获1
# 对于一些python当中已经存在的内置函数 内置数据类型 内置模块中的方法
# 都有可能依赖于类中的内置方法
# 收获2
# set方法依赖集合中元素对象的__hash__ __eq__

Day 30 面向对象的考试题的更多相关文章

  1. 30 面向对象编程 抽象类 abstract 修饰符可以用来修饰方法也可以修饰类

    抽象类 概念 abstract 修饰符可以用来修饰方法也可以修饰类, 如果修饰方法,那么该方法就是抽象方法: 如果修饰类,那么该类就是抽象类. 抽象类中可以没有抽象方法,但是有抽象方法的类一定要声明为 ...

  2. 【Java】 语言基础习题汇总 [2] 面向对象

    30 面向对象的三条主线和面向对象的编程思想? 类与类的成员 : 属性.方法.构造器.代码块.内部类. 面向对象的三大特征:封装.继承.多态[如果还有一个,那就是抽象] 关键字:this.super. ...

  3. 33条C#和.NET经典面试题目及答案

    1. .NET中类和结构的区别? 答:结构和类具有大体的语法,但是结构受到的限制比类要多. a. 结构不能有默认的构造函数,因为结构的副本是用编译器创建和销毁的,所以不需要默认的构造函数和析构函数. ...

  4. 慕课网:C++ & 数据结构

    课程链接:james_yuan的课程 这部分太枯燥了,如果教材难度稍大,根本就学不下去,所以就先看看通俗的视频吧. 课程目录 1.C++远征之起航篇 - C++亮点尽在其中 2.C++远征之离港篇 - ...

  5. 33条C#、.Net经典面试题目及答案

    33条C#..Net经典面试题目及答案[zt] 本文集中了多条常见的C#..Net经典面试题目例如".NET中类和结构的区别"."ASP.NET页面之间传递值的几种方式? ...

  6. 33条C#、.Net经典面试题目及答案[zt]

    33条C#..Net经典面试题目及答案[zt] 本文集中了多条常见的C#..Net经典面试题目例如“.NET中类和结构的区别”.“ASP.NET页面之间传递值的几种方式?”,并简明扼要的给出了答案,希 ...

  7. .net常見面試題(三)

    1, 请你说说.NET中类和结构的区别? 答:结构和类具有大体的语法,但是结构受到的限制比类要多.结构不能申明有默认的构造函数,为结构的副本是又编译器创建和销毁的,所以不需要默认的构造函数和析构函数. ...

  8. PHP与memcache和memcached以及安装使用

    老规则,在作者寒冰讲之前我们要来明确memcache与memcached这两个东西到底是什么? 说法一: 两个不同版本的php的memcached的客户端 new memcache是pecl扩展库版本 ...

  9. C#___.net经典题

    1 请你说说   .NET  中类和结构的区别? 答:结构和类具有大体的语法,但是结构受到的限制比类要多.结构不能申明有默认的构造函数,为结构的副本是又编译器创建 和销毁的,所以不需要默认的构造函数和 ...

随机推荐

  1. git format-patch 用法【转】

    本文转载自:http://blog.csdn.net/xzongyuan/article/details/9425739 git format-patch相对于git diff更便于操作,是更新的打包 ...

  2. Laravel 5.4+Vue.js 初体验:Laravel下配置运行Vue.js

    生产材料PHP:PHP 5.6+Laravel 5.4:https://github.com/laravel/laravel/releases/Composer:http://getcomposer. ...

  3. CSV 文件

    CSV 文件 CSV(Comma Separated Values 逗号分隔值) 是一种文件格式(如.txt..doc等),也可理解 .csv 文件就是一种特殊格式的纯文本文件.即是一组字符序列,字符 ...

  4. 『jQuery』.html(),.text()和.val()的使用

    『jQuery』.html(),.text()和.val()的使用 2013-04-21 10:25 by 我是文东, 8335 阅读, 0 评论, 收藏, 编辑 本节内容主要介绍的是如何使用jQue ...

  5. 修改Swing窗口风格

    String look; java:    look = "javax.swing.plaf.metal.MetalLookAndFeel"; Windows:    look = ...

  6. Django入门与实践-第18章:访问已登录用户(完结)

    http://127.0.0.1:8000/boards/1/topics/1/ #boards/views.py @login_required def new_topic(request, pk) ...

  7. Scrapy学习篇(十三)之scrapy-splash

    之前我们学习的内容都是抓取静态页面,每次请求,它的网页全部信息将会一次呈现出来. 但是,像比如一些购物网站,他们的商品信息都是js加载出来的,并且会有ajax异步加载.像这样的情况,直接使用scrap ...

  8. IntelliJ IDEA 2017版 spring-boot使用Spring Data JPA使用Repository<T, T>编程

    1.环境搭建pom.xml搭建 <?xml version="1.0" encoding="UTF-8"?> <project xmlns=& ...

  9. HDU 5618 Jam's problem again (cdq分治+BIT 或 树状数组套Treap)

    题意:给n个点,求每一个点的满足 x y z 都小于等于它的其他点的个数. 析:三维的,第一维直接排序就好按下标来,第二维按值来,第三维用数状数组维即可. 代码如下: cdq 分治: #pragma ...

  10. 学习前端的菜鸡对JS的call,apply,bind的通俗易懂理解

       call,apply,bind 在JavaScript中,call.apply和bind是Function对象自带的三个方法,都是为了改变函数体内部 this 的指向.            a ...