#1.魔術(shù)方法
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ù)作為變量
? ? ? ? #變量的復(fù)制所存儲的結(jié)果取決于初始化的時候所傳進來的參數(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.若都沒有守呜,則報錯