1.简述类 对象 实例化 实例 这些名词的含义
类:是对具有相同属性和相似行为的一类事物的抽象
对象:是具有具体属性的类的实例化
实例化:从一个抽象的类变为一个具体的对象的过程
实例:就是对象

 

2.面向对象的三大特性
继承多态封装

 

3.什么是方法?类中可以定义哪种方法?
在类中的函数就是方法,描述的是一类事物的行为
方法 类方法 静态方法 私有方法 内置方法 属性方法(@property)

 

4.什么是属性?类中可以定义哪几种属性
类和对象所拥有的具体的"值"指标
私有属性 静态属性 动态属性(方法) 对象属性


5.请简述类方法和静态方法有哪些区别?
装饰器不同@staticmethod静态方法 @classmethod类方法

 

6.简述新式类和经典类的区别
#在py3里 所有的多继承问题 都符合 广度优先算法
#python3中的所有类 都默认继承object

#如果一个类 继承了object 这个类就被称为新式类
#没有继承object类 就被称为经典类

#深度优先 广度优先 都是一种遍历算法,把这个图中所有的项都走一遍,且不会重复

#经典类 遵循 深度优先算法 且没有mro方法 python2
#新式类 遵循 广度优先算法 有mro方法 py2 py3
#py3 super
#单继承中 super就是找父类
#多继承 super寻找的轨迹是根据mro(广度优先)顺序的

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__

 

posted on 2018-03-16 20:45  仓鼠大人爱吃肉  阅读(224)  评论(0编辑  收藏  举报