19. Python 類的重寫 類的私有變量和私有方法
1.類的重寫
例子:
class parent(object): name = ‘parent‘ age = 100 def __init__(self): print(‘my name is parent‘) def get_name(self): return self.name def get_age(self): return self.age class child(parent): name = "child" def __init__(self): print(‘my name is {0}‘.format(self.name)) def hello(self): print(‘hello {0}‘.format(self.name)) a = child() a.hello() print(a.get_name()) print(a.get_age())
上面的例子,如果覺得父類的方法不好,想要寫個新的方法,
我們在子類中重寫get_name的方法,從而把父類的方法頂掉,怎麽做呢?
class parent(object): name = ‘parent‘ age = 100 def __init__(self): print(‘my name is parent‘) def get_name(self): return self.name def get_age(self): return self.age class child(parent): name = "child" def __init__(self): print(‘my name is {0}‘.format(self.name)) def hello(self): print(‘hello {0}‘.format(self.name)) def get_name(self): print (‘nice day!‘) a = child() a.hello() a.get_name() print(a.get_age())
結果:
my name is child
hello child
nice day!
100
這樣就對 類的方法 進行了重寫。
另外一種情況,__init__ 在類的初始化的時候,一般情況下不繼承,上面parent類和child類裏面的兩個__init__不互相繼承
類的初始化的時候,不管是父類還是子類,初始化的時候,每個類只走自己的__init__;
如果子類在初始化的時候,需要執行父類中的__init__時,怎麽操作?
還是那個例子:
class parent(object): name = ‘parent‘ age = 100 def __init__(self, address, sex): self.address = address self.sex = sex print(‘my name is parent‘) def get_name(self): return self.name def get_age(self): return self.age class child(parent): name = "child" def __init__(self): print(‘my name is {0}‘.format(self.name)) def hello(self): print(‘hello {0}‘.format(self.name)) def get_name(self): print(‘nice day!‘) a = child() a.hello() a.get_name() print(a.get_age())
如上例,如果child類想把 parent類中__init__裏的address、sex繼承過去,用 super() 方法
class parent(object): parent_name = ‘parent‘ age = 100 def __init__(self, address, sex): self.address = address self.sex = sex print(‘my name is parent‘) def get_name(self): return self.name def get_age(self): return self.age class child(parent): child_name = "child" def __init__(self, address, sex): super(child, self) = __init__(address,sex) print(‘my name is {0}‘.format(self.name)) def hello(self): print(‘hello {0}‘.format(self.name)) def get_name(self): print(‘nice day!‘)
2.類的私有變量和私有方法
在Python中可以通過在屬性變量名前加上雙下劃線定義屬性為私有屬性
特殊變量命名
1、 _xx 以單下劃線開頭的表示的是protected類型的變量。即保護類型只能允許其本身與子類進行訪問。若內部變量標示,如: 當使用“from M import”時,不會將以一個下劃線開頭的對象引入 。
2、 __xx 雙下劃線的表示的是私有類型的變量。只能允許這個類本身進行訪問了,連子類也不可以用於命名一個類屬性(類變量),調用時名字被改變(在類FooBar內部,__boo變成_FooBar__boo,如self._FooBar__boo)
3、 __xx__定義的是特列方法。用戶控制的命名空間內的變量或是屬性,如init , __import__或是file 。只有當文檔有說明時使用,不要自己定義這類變量。 (就是說這些是python內部定義的變量名)
在這裏強調說一下私有變量,python默認的成員函數和成員變量都是公開的,沒有像其他類似語言的public,private等關鍵字修飾.但是可以在變量前面加上兩個下劃線"_",這樣的話函數或變量就變成私有的.這是python的私有變量軋壓(這個翻譯好拗口),英文是(private name mangling.) **情況就是當變量被標記為私有後,在變量的前端插入類名,再類名前添加一個下劃線"_",即形成了_ClassName__變量名.**
Python內置類屬性
__dict__ : 類的屬性(包含一個字典,由類的數據屬性組成)
__doc__ :類的文檔字符串
__module__: 類定義所在的模塊(類的全名是‘__main__.className‘,如果類位於一個導入模塊mymod中,那麽className.__module__ 等於 mymod)
__bases__ : 類的所有父類構成元素(包含了一個由所有父類組成的元組)
本文出自 “筆記空間” 博客,請務必保留此出處http://286577399.blog.51cto.com/10467610/1979780
19. Python 類的重寫 類的私有變量和私有方法