2020.2.8
对象(属性、方法)
例一:
class Turtle:#类
#属性:变量
color = 'green'
weight = 10
legs = 4
shell = True
mouth = '大嘴'
#方法:函数
def climb(self):
print("爬")
def run(self):
print("跑")
def bite(self):
print("咬")
def eat(self):
print("吃")
def sleep(self):
print("睡")
oo的特征(Object Oriented)
1、封装:信息隐蔽技术
2、继承:子类自动共享父类之间数据和方法的机制
3、多态:不同对象对同一方法响应不同的行动
OOA:面向对象分析
面向对象 OOD:面向对象设计
OOP:面向对象编程
self:当一个对象的方法被调用时,对象会将自身传递给self参数
——init——(self):构造方法,在实例化一个对象的时候,这个方法就会在对象被创建的时候自动调用
class Ball:
def__init__(self,name):
self.name = name
def kick(self):
print("我叫%s,该死的,谁踢我..."% self.name)
b = ball('土豆')
b.kick()
输出:
我叫土豆,该死的,谁踢我...
共有和私有:在PYTHON中定义私有变量只需要在变量名或者函数名前面加上“__”两个下划线,那么这个函数或变量就会为私有的了
name mangling:名字改编,名字重整
例二:
class Person:
name = 'yyqx'
p = Person()
p.name
输出:
yyqx
class Person:
__name = 'yyqx'
def getName(self):
return self.__name
p = Person()
p.getName()
输出:
yyqx
p._Person__name
输出:
yyqx
题目:我们试图模拟一个场景,里边有一只乌龟和十条鱼,乌龟通过吃鱼来补充体力,当乌龟体力消耗殆尽或者鱼被吃光则游戏结束,并给鱼进行细分,有金鱼(Goldfish),鲫鱼(Carp),三文鱼(Salmon),鲨鱼(Shark)。(能不能不要每次都从头到尾去重新定义一个新的鱼类呢?因为我们知道大部分鱼的属性和方法是相似的)
例如:
class Parent:
def hello(self):
print("父母")
class Child(Parent):
pass
p = Parent()
p.hello()
#输出:
#父母
c = Child()
c.hello()
#输出:
#父母
class Child(Parent):
def hello(self):
print("儿女")
c = Child()
c.hello()
#输出:
#儿女
p.hello()
#输出:
#父母
答案:方法一:直接调用父类
import random as r
class Fish:
def __init__(self):
self.x = r.randint(0,10)
self.y = r.randint(0,10)
def move(self):
self.x -= 1
print("我的位置是:",self.x,self.y)
class Goldfish(Fish):
pass
class Crap(Fish):
pass
class Salmon(Fish):
pass
class Shark(Fish):
def __init__(self):
Fish.__init__(self)
self.hungry = True
def eat(self):
if self.hungry:
print("Eating")
self.hungry = False
else:
print("Not Eating")
方法二:使用super函数:调用基类的方法
import random as r
class Fish:
def __init__(self):
self.x = r.randint(0,10)
self.y = r.randint(0,10)
def move(self):
self.x -= 1
print("我的位置是:",self.x,self.y)
class Goldfish(Fish):
pass
class Crap(Fish):
pass
class Salmon(Fish):
pass
class Shark(Fish):
def __init__(self):
super().__init__()
self.hungry = True
def eat(self):
if self.hungry:
print("Eating")
self.hungry = False
else:
print("Not Eating")
多重调用:同时继承多个父类的方法
class Base1:
def foo1(self):
print("Base1")
class Base2:
def foo2(self):
print("Base2")
class C(Base1,Base2):
pass
c = C()
c.foo1()
输出:
Base1
c.foo2()
输出:
Base2
组合:将横向的类组合在一起(Mix-in)
题目:定义一个类,叫水池,水池里要有乌龟和鱼
class Turtle:
def __init__(self,x)
self.num = x
class Fish:
def __init__(self,y)
self.num = y
class Pool:
def __init__(self,x,y)
self.turtle = Turtle(x)
self.fish = Fish(y)
def print_num(self):
print("%d只乌龟,%d只鱼"%(self.turtle.num,self.fish.num))
pool = Pool(1,10)
pool.print_num()
输出:
1只乌龟,10只鱼
类、类对象、实例对象
举例:类(class C)、类对象 (C)、实例对象 (a,b,c)
class C:
count = 0
a = C()
b = C()
c = C()
a.count #0
b.count #0
c.count #0
c.count += 10
c.count #10
a.count #0
b.count #0
C.count #0
C.count += 100
a.count #100
b.count #100
c.count #10
注意:
1、不要试图在一个类里边定义出所有能想到的特征和方法,应该利用继承和组合机制来进行扩展
2、用不同的词性命名,如属性名用名词,方法名用动词
绑定:Python严格要求方法需要有实例才能被调用,这种限制就是所谓的绑定概念
类和对象相关的BIF
issubclass(class,classinfo):若class是classinfo的子代,则返回True
注意:
1、一个类被认为是其自身的子类
2、classinfo可以是类对象组成的元组,只要class与其中任何一个候选类的子类,则返回True
isinstance(object,classinfo):检查一个对象是否属于一个类的实例对象
注意:
1、如果第一个参数不是对象,则永远返回False
2、如果第二个参数不是类或者由类对象组成的元组,则会抛出一个TypeError异常
hasattr(object,name):用于判断对象是否包含指定的属性
class C:
def __init__(self,x = 0):
self.x = x
c1 = C()
hassattr(c1,'x')
输出:
True
getattr(object,name[,default]):用于返回一个对象属性值
注意:
1、如果对象属性值存在则返回其默认值
2、若对象属性不存在则返回AttributeError异常
setattr(object,name,value):设置指定对象某个属性的值,若指定的属性不存在,则新建属性并赋值
delattr(object,name):删除指定对象某个属性的值,若指定的属性不存在,则抛出AttributeError的异常
property(fget = None,fset = None,fdel = None,doc = None):在新式类中返回属性值
class C:
def __init__(self,size = 10):
self.size = size
def getSize(self):
return self.size
def setSize(self,value)
self.size = value
def delSize(self):
del self.size
x = property(getSize,setSize,delSize)
c1 = C()
c1.getSize()
#输出:
#10
c1.x
#输出:
#10
c1.x = 18
c1.x
#输出:
#18
c1.size
#输出:
#18
c1.getSize()
#输出:
#18
del c1.x
c1.size
#抛出AttributeError异常