六、Python之OOP
序言
C是面向过程编程,而C++、Java则是面向对象编程(OPP)。数学是描述自然的语言,现实世界在编程语言中就抽象成了数据,比如在编程语言中要描述一个人,只需要给出ta的姓名、性别、年龄、体重等数据就可以了,所谓对象只不过是对数据的一种封装形式。“对象=属性+方法”,一个对象的特征称为属性,一个对象的行为称为“方法”
创建对象类
class Turtle: # Python中约定类名用大写字母开头,函数小写字母开头
#属性,从代码来看就是变量
color='green'
weight=10
legs=4
shell=True
mouth='大嘴'
#方法,从代码来看就是函数
def climb(self):
print("爬!")
def run(self):
print("跑!")
def bite(self):
print("咬!")
>>>tt=Turtle() #创建类的实例
>>>tt.color
'green'
>>>tt.climb()
'爬!'
OO(Object Oriented)特点
- 封装
数据荫蔽 - 继承与多态
要创建一个新的类,其属性、方法与已有的类非常相似,这时候不需要完全重新编制该新类,可以通过“继承”得到父类的属性和方法。
class Parent:
def hello(self):
print("我好困")
class Child(Parent): # Class 类型(被继承的类)
def hello(self): # 子类定义与父类相同的属性、方法会自动覆盖父类相应的属性、方法
print("洗洗睡了")
>>> p=Parent()
>>> c=Child()
>>> p.hello()
"我好困"
>>> c.hello() # 同一个方法(hello)的效果不同,称为多态。
"洗洗睡了"
self指针
由于一个类(class)可以实例化为多个对象,因此这些对象在调用方法时,方法要知道具体是哪一个对象在调用,故对象的每个方法都默认self(自己)作为第一个参数。
class Ball:
def setName(self,name):
self.name=name # Ball.name=name
def kick(self):
print('敢踢我%s,试试' %(self.name))
>>> a=Ball()
>>> b=Ball()
a.setName('球A')
b.setName('球B')
公有和私有
只要在变量名、函数名前加__(两个下划线),该变量、函数就变成私有的了
class Turtle:
__name='乌龟'
color='green'
def disName(self):
print(disName)
>>>tt.Turtle()
>>>tt.__name
Error
>>>tt.disName()
乌龟
>>>tt._Turtle__name # python是伪私有
乌龟
多重继承与组合
# 多重继承,class 类名(父类1,父类2,父类3,...)
class Parent1:
def foo1(self):
print("我是真的!")
class Parent2:
def foo2(self):
print("他是假的!")
>>>class child(Parent1,Parent2) # 多重继承
>>>child.foo1()
"我是真的!"
>>>child.foo2()
"他是假的!"
# 组合,在没有父子代的概念时这是“继承”就需要用“组合”代替
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) #实例化一个Turtle对象存入自身的turtle参数中
self.fish=Fish(y) #实例化一个Turtle对象存入自身的fish参数中
def print_num(slef):
print("水池中有乌龟%d,小鱼%d"%(self.turtle.num,self.fish.num))
>>>pool=Pool(1,10) # 类的实例化
>>>pool.print_num()
"水池中有乌龟1,小鱼10"

浙公网安备 33010602011771号