8 面向物件基礎(一)
阿新 • • 發佈:2018-11-12
8.1面向物件程式設計介紹
- 面向物件(object-oriented ;簡稱: OO)
- 面向物件程式設計(Object Oriented Programming-OOP)
- 面向過程
8.2 類和物件
8.3 定義類
8.4 建立物件
class Dog(object): # 定義一個Dog類 def eat(self): # 定義一個eat方法 print("---吃---") def drink(self): # 定義一個drink方法 print("---喝---") wang_cai = Dog() # 建立一個物件,建立一個例項 wang_cai.eat() wang_cai.drink() # wang_cai.say() xiao_tian = Dog() xiao_tian.eat() xiao_tian.drink()
8.5 新增和獲取物件的屬性
class Dog(object): def eat(self): print("---吃---") def drink(self): print("---喝---") wang_cai = Dog() wang_cai.name = "旺財" # 給wang_cai這個物件新增一個name屬性 wang_cai.age = 10 print(wang_cai.name) print(wang_cai.age) # wang_cai.eat() xiao_tian = Dog() xiao_tian.name = "哮天" xiao_tian.age = 12 print(xiao_tian.name)
8.6 self
""" 給物件新增屬性: wang_cai.name = "旺財" 物件名.屬性名 = 值 獲取物件的屬性: 物件名.屬性名 wang_cai.say() # 在呼叫這個say方法的時候,python直譯器幫我們傳遞了前面這個物件作為實參被self接收了,所以誰在呼叫,self就是誰 """ class Dog(object): def eat(self): print("---吃---") def drink(self): print("---喝---") def say(self): print("我的名字叫%s" % self.name) wang_cai = Dog() wang_cai.name = "旺財" # 給wang_cai這個物件新增一個name屬性 wang_cai.say() # 在呼叫這個say方法的時候,python直譯器幫我們傳遞了前面這個物件作為實參被self接收了,所以誰在呼叫,self就是誰 xiao_tian = Dog() xiao_tian.name = "哮天" xiao_tian.say()
8.7 init()方法
"""
wang_cai = Dog("旺財", 10)
到底做了哪些事情:
1、建立一個物件
2、建立物件成功之後,自動呼叫__init__()方法
3、讓wang_cai去指向這個創建出來的物件
"""
class Dog(object):
def __init__(self, aaa, bbb):
"""
初始化方法
在建立物件之後,把一些屬性先設定好
"""
self.name = aaa
self.age = bbb
def eat(self):
print("---吃---")
def drink(self):
print("---喝---")
wang_cai = Dog("旺財", 10) # 建立物件(例項)
# wang_cai.name = "旺財"
# print(wang_cai.name)
# print(wang_cai.age)
#
#
# xiao_tian = Dog("哮天", 12)
# print(xiao_tian.name)
# print(xiao_tian.age)
8.8__str__()方法
"""
wang_cai = Dog("旺財", 10)
到底做了哪些事情:
1、建立一個物件
2、建立物件成功之後,自動呼叫__init__()方法
3、讓wang_cai去指向這個創建出來的物件
"""
class Dog(object):
def __init__(self, aaa, bbb):
"""
初始化方法
在建立物件之後,把一些屬性先設定好
"""
self.name = aaa
self.age = bbb
def __str__(self):
"""
美化直接列印物件名的結果(直接列印物件名得到的是一個地址)
1、這個方法裡面一定要有return
2、return 返回值一定是字串
直接列印列印物件名的時候就不再是地址了,而是return後面的這個字串
所以直接列印物件名的時候,就會來執行這裡的程式碼
"""
return "我叫%s,今年%s歲了" % (self.name, self.age)
def eat(self):
print("---吃---")
def drink(self):
print("---喝---")
wang_cai = Dog("旺財", 10) # 建立物件(例項)
print(wang_cai)
8.9 del()方法
-
建立物件後,python直譯器預設呼叫__init__()方法;
-
當刪除物件時,python直譯器也會預設呼叫一個方法,這個方法為__del__()方法
-
當有變數儲存了一個物件的引用時,此物件的引用計數就會加1;
-
當使用del() 刪除變數指向的物件時,則會減少物件的引用計數。如果物件的引用計數不為1,那麼會讓這個物件的引用計數減1,當物件的引用計數為0的時候,則物件才會被真正刪除(記憶體被回收)。
8.10 應用:烤地瓜
"""
烤地瓜:
示例屬性如下:
cookedLevel : 這是數字;0~3表示還是生的,超過3表示半生不熟,超過5表示已經烤好了,超過8表示已經烤成木炭了!我們的地瓜開始時時生的
cookedString : 這是字串;描述地瓜的生熟程度
condiments : 這是地瓜的配料列表,比如番茄醬、芥末醬等
示例方法如下:
cook() : 把地瓜烤一段時間
addCondiments() : 給地瓜新增配料
__init__() : 設定預設的屬性
__str__() : 讓print的結果看起來更好一些
"""
class Yam(object):
def __init__(self):
# 定義一個屬性,來描述生熟程度
self.string = "生的"
# 定義一個屬性,記錄地瓜被烤的總時長
self.all_time = 0
# 定義一個列表,來存放這些配料
self.condiments = []
def __str__(self):
return "這個地瓜%s, 已經新增的配料有:%s" % (self.string, self.condiments)
def cooked(self, time):
self.all_time = self.all_time + time
if 0 <= self.all_time <= 3:
# 還是生的
self.string = "生的"
elif 3 < self.all_time <= 5:
# 半生不熟
self.string = "半生不熟"
elif 5 < self.all_time <= 8:
# 已經烤好了
self.string = "烤好了"
else:
# 烤成木炭了
self.string = "烤成木炭"
def add_sth(self, name):
self.condiments.append(name)
yam = Yam()
print(yam)
yam.cooked(4)
print(yam)
yam.cooked(2)
print(yam)
#
yam.add_sth("辣椒醬")
yam.add_sth("孜然")
yam.add_sth("番茄")
print(yam)