一、類之初印象
1、類就是空表格,將變量(列名)和函數(行為)結合起來
2、創建對象,表達具體行
3、創建類就是創建數據的模板
? ? ? ? --操作數據時有提示
? ? ? ? --還能再組合數據的行為
? ? ? ? --結構更加清晰
4、類的內存分配
?5、練習
"""參照day08/homework/exercise01創建餐廳類-- 變量:字典的鍵-- 函數:打印
"""
# 類統一了字典所有key,并提供了相關函數
class Restaurant:def __init__(self, city, name="", remark=0, money=0):self.city = cityself.name = nameself.remark = remarkself.money = moneydef display(self):print("%s在%s地區,點評人數%s,人均消費%s元." % (self.name, self.city, self.remark, self.money))# 創建對象
# --(1)根據實例變量開辟空間
# --(2)執行__init__函數
xqwct = Restaurant("北京", "星期五餐廳", 2847, 180)
tmz = Restaurant("北京","鐵木真",3497,104)
print(xqwct.remark)
# 通過對象調用函數,自動將對象作為參數傳遞給self
xqwct.display() # display(xqwct)
tmz.display()
?二、類語法
(1)類定義
1、代碼
class 類名:"""文檔說明"""def __init__(self,參數):self.實例變量 = 參數def 實例方法(self,參數):pass
2、說明
????????-- 類名所有單詞首字母大寫
????????-- init 也叫構造函數,創建對象時被自動調用,也可以省略。
????????-- self 變量綁定的是被創建的對象,名稱可以隨意, self就是對象 。
3、實例化
? ? ? 代碼:對象名 = 類名 ( 數據 )
說明:
????????-- 對象名存儲的是實例化后的對象地址
????????-- 類名后面的參數按照構造函數的形參傳遞(__init__函數)
(2)實例成員
1、實例變量
定義:對象 . 變量名(self.變量名)
調用:對象 . 變量名
說明 : 通常在構造函數 (__init_) 中創建,首次通過對象賦值為創建,再次賦值為修改.
? ? ? ? ? ? 每個對象存儲一份,通過對象地址訪問
__dict__ :對象的屬性,用于存儲自身實例變量的字典。
2、實例方法
?????????def 方法名(self,參數):
????????????????方法體(通過“self.變量名"訪問實例變量)
調用:對象名.方法名(變量)
說明:至少有一個形參,第一個參數綁定調用這個方法的對象 , 一般命名為self。
? ? ? ? ? ?無論創建多少對象,方法只有一份,并且被所有對象共享。
# 類中self就是對象名
# 類外自己命名的為對象名
class Epidemic:def __init__(self, region):# 創建實例變量self.region = regionself.display()# 定義實例方法def display(self):print(self.region)bj = Epidemic("北京")
bj.display()# 讀取實例變量
print(bj.region)
# python語言將實例變量存入字典
print(bj.__dict__) # {'region': '北京'}# Python支持在類外創建實例變量,不建議使用
"""
class Epidemic:pass
sh = Epidemic()
sh.region = "上海" # 當前對象有此實例,其他對象無
print(sh.region)
dd = Epidemic()
# print(dd.region) 錯誤
"""# 建議在__init__ 中定義實例變量
"""
class Epidemic:def set_name(a, name): # self 可以為任意命名為其他# 創建實例變量a.name = name
bj = Epidemic()
bj.set_name("北京")
print(bj.name)
print(bj) # 打印自定義對象,輸出為真實內存地址
"""
3、類實例化內存分配
?
?
?(3)跨類調用
?跨類調用語法1:直接創建對象
????????語義:XX每次去東北都開一輛新車,因為Car()為局部變量
????????通俗:每次用新的
class Person:def __init__(self, name):self.name = namedef driver(self):print(self.name,"駕駛去東北")car = Car()car.run()class Car:def run(self):print("騎車在行駛")lz = Person("老張") ll = Person("老李") lw = Person("老王")lz.driver() # 老張駕駛新車去東北 ll.driver() # 老李駕駛新車去東北 lw.driver() # 老王駕駛新車去東北 lz.driver() # 老張駕駛新車去東北
?跨類調用語法2:在構造函數中創建對象
????????語義:XX每次去東北都開自己的車,__init__只執行一次
????????通俗:每次用舊的
class Person:def __init__(self, name):self.name = nameself.car = Car() # 每個對象一個def driver(self):print(self.name,"駕駛去東北")# car = Car() # 多次就是多個self.car.run()class Car:def run(self):print("騎車在行駛")lz = Person("老張") # __init__ 造車,只有一次 lz.driver() lz.driver()
?跨類調用語法3:通過參數傳遞對象,建議使用
????????語義:XX每次去東北都乘交通工具
????????通俗:每次用的時候再選擇
class Person:def __init__(self, name):self.name = namedef driver(self,vehicle):print(self.name,"駕駛去東北")vehicle.run()class Car:def run(self):print("騎車在行駛")lz = Person("老張") # __init__ 造車,只有一次 car = Car() # 沒有定義類時,確定關系 # 而是在用類時,確定關系 lz.driver(car)