天天看點

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__ :類的文檔字元串