15.類與可口可樂(3)

#1.魔術方法

def __init__():

在類里定義,在創(chuàng)建實例時能幫助你自動的處理很多事情,比如新增實例屬性

__init__()是initialize(初始化)的縮寫

#Demo 1.1

class Cocacola():

????formula = ['caffine','sugar','water','soda']

????def __init__(self):

? ? ? ? self.local_logo = '可口可樂'

????def drink(self):

????????print('Energy!')

coke = Cocacola()

print(coke.local_logo)

#>>>可口可樂

#Demo 1.2

class Cocacola:

????formula = ['caffine','sugar','water','soda']

????def __init__(self):

????????for element in self.formula:

????????????????print('Coke has {}!'.format(element))

? ? def drink(coke):

????????????????print('Energy!')

coke = Cocacola()

#Demo 1.3

#__init__()的說明:

#1.__init__可以擁有自己的參數(shù)

#2.__init__可以自動執(zhí)行,不需要使用obj.__init__()的方式來執(zhí)行

class Cocacola:

????formula = ['caffine','sugar','water','soda']

????def __init__(self,logo_name):

????????self.local_logo = logo_name

? ? ? ? #左邊是變量作為類的屬性,右邊是傳入這個參數(shù)作為變量

? ? ? ? #變量的復制所存儲的結果取決于初始化的時候所傳進來的參數(shù)logo_name

? ? ? ? #傳進來什么就將是什么def drink(self):

????????print('Energy!')

coke = Cocacola('可口可樂')

print(coke.local_logo)


#2.類的繼承(inheritance)

#Demo 2.1 配方的重定義

#所有子品類都會繼承可口可樂的品牌--->類的繼承(inheritance)

class Cocacola:

????calories = 140

????sodium = 45

????total_carb = 39

????caffine = 34

????ingredients = [

????????'High Fructose Corn Syrup'

????????'Carbonated Water'

????????'Phosphoric Acid'

????????'Natural Flavors'

????????'Caramel Color'

????????'Caffine'????????

????]

????def __init__(self,logo_name):

????????self.local_logo = logo_name

????def drink(self):

????????print('You got {} cal energy!'.format(self.calories))

????????self = self

class CaffineFree(Cocacola):

? ? #在新的類CaffineFree后的括號里放入Cocacola,表示這個欸繼承于父類CocaCola

? ? #父類中的變量完全被子類繼承。有改動可以進行覆蓋(Override)

????caffine = 0

????ingredients = [

????????'High Fructose Corn Syrup'

????????'Carbonatd Water'

????????'Phosphoric Acid'

????????'Natural Flavors'

????????'Caramel Color'

????????]

coke_a = CaffineFree('Cocacola-FREE')

coke_a.drink()

#3.類屬性與實體屬性


#Q1 :類屬性如果被重新賦值,是否影響到類屬性的引用?YES

class TestA:

????attr = 1

obj_a = TestA()

TestA.attr = 42

print(obj_a.attr)????????#print 42


#Q2 :實例屬性如果被重新賦值,是否影響到類屬性引用?NO

class TestA:

????attr =1

obj_a = TestA()

obj_b = TestA()

obj_a.attr =42

print(obj_b.attr)????????#print 1

#Q3 類屬性實例屬性具有相同的名稱,那么.后面引用的將會是什么? 實例屬性

class TestA:

? ? attr = 1? # 類屬性

????def __init__(self):

? ? ? ? self.attr = 42? # 實例屬性

obj = TestA()

print(obj.attr)? ? ?#print 42


#4.說明(※※※)

#Demo 4.1

#__dict__是一個類的特殊屬性,是一個字典,存儲類或?qū)嵗膶傩?/p>

print(TestA.__dict__)

輸出 :#{'__module__': '__main__', 'attr': 1, '__init__': , '__dict__': , '__weakref__': , '__doc__': None}

print(obj.__dict__)

輸出:#{'attr':42}

#類TestA和類的實例obj_a各自擁有各自的attr屬性,互相完全獨立

#Demo 4.2

Python的引用機制是自外而內(nèi)的。創(chuàng)建實例后引用屬性:

1.編譯器會先搜索實例是否擁有這個屬性。若有則引用。

2.若沒有,搜索實例所屬的類是否有這個屬性。若有則引用

3.若都沒有,則報錯

類屬性引用與實例屬性引用
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容