About Class

 

What‘s Class? Blueprint 設計藍圖python

把相同行爲的對象概括爲類(class),程序員

經過類的封裝(encapsulation)隱藏內部細節,函數

經過繼承(inheritance)實現類的特化(specialization)和泛化(generalization),學習

經過多態(polymorphism)實現基於對象類型的動態分派設計

class Student(object):

    # __init__是一個特殊方法用於在建立對象時進行初始化操做
    # 經過這個方法咱們能夠爲學生對象綁定name和age兩個屬性
    def __init__(self, name, age):
        self.name = name      #self.name這個標籤指向的是name參數傳進來的值,這個參數類是str,也有它本身的id 和 value
        self.age = age

    def study(self, course_name):
        print('%s正在學習%s.' % (type(self.name), course_name))

    # PEP 8要求標識符的名字用全小寫多個單詞用下劃線鏈接
    # 可是部分程序員和公司更傾向於使用駝峯命名法(駝峯標識)
    def watch_movie(self):
        if self.age < 18:
            print('%s只能觀看《熊出沒》.' % self.name)
        else:
            print('%s正在觀看島國愛情大電影.' % self.name)

一、self.name這個標籤指向的是name參數傳進來的值,這個參數類是str,也有它本身的code

def main():
    # 建立學生對象並指定姓名和年齡
    stu1 = Student('駱昊', 38)  #類的實例化過程是否是將stu1標籤綁定Student('駱昊', 38)的過程?
    # 給對象發study消息
    stu1.study('Python程序設計')# 使用類的方法
    # 給對象發watch_av消息
    stu1.watch_movie()
    stu2 = Student('王大錘', 15)
    stu2.study('思想品德')
    stu2.watch_movie()


if __name__ == '__main__':
    main()

訪問的可見性(C語言中私有變量的定義已經忘光啦~)對象

在Python中,屬性和方法的訪問權限只有兩種,也就是公開的和私有的,繼承

若是但願屬性是私有的,在給屬性命名時能夠用兩個下劃線做爲開頭ci

即python中的屬性通常是公開的(可能通常類中不會有私有方法)it

class Test:

    def __init__(self, foo):
        self.__foo = foo

    def __bar(self):
        print(self.__foo)
        print('__bar')


def main():
    test = Test('hello')
    # AttributeError: 'Test' object has no attribute '__bar'
    test.__bar()
    # AttributeError: 'Test' object has no attribute '__foo'
    print(test.__foo)
------------------------------------------------------------------
------------------------------------------------------------------
下方是正確的訪問方法,python沒有從語法上嚴格保證私有屬性或方法的私密性,
只是給私有的屬性和方法換了一個名字來「妨礙」對它們的訪問
即test._Test__bar(),在私有方法前__bar()加上_Test類名才能訪問
def main():
    test = Test('hello')
    # AttributeError: 'Test' object has no attribute '__bar'
    test._Test__bar()
    
    # AttributeError: 'Test' object has no attribute '__foo'
    print(test._Test__foo)
if __name__ == "__main__":
    main()

下方是正確的訪問方法,python沒有從語法上嚴格保證私有屬性或方法的私密性,
只是給私有的屬性和方法換了一個名字來「妨礙」對它們的訪問
即test._Test__bar(),在私有方法前__bar()加上_Test類名才能訪問

單下劃線 VS 雙下劃線

單下劃線開頭:保護成員,只有類對象和子類對象本身可以訪問到這些變量,(以單下劃線結尾僅僅是爲了區別該名稱與關鍵詞)

以單下劃線開頭的變量和函數被默認是內部函數,

使用from module import *時不會被獲取,可是使用import module能夠獲取。

雙下劃線:私有成員,只容許類自己訪問,子類也不行,編譯後會被替換爲_class__method

例1

class A(object):
	def _internal_use(self):
		pass
	def __method_name(self):
		pass
def main():
	print(dir(A()))

if __name__ == "__main__":
	main()

---------------------------------------
---------------------------------------
['_A__method_name', ..., '_internal_use']

輸出的通過編譯後改成了_A__method_name

繼承A類在構建一個類B
class B(A):
	def __method_name(self):
		pass


def main():
	print(dir(B()))

if __name__ == "__main__":
	main()

----------------------------------------
----------------------------------------
['_A__method_name', '_B__method_name', ..., '_internal_use']

 

雙下會被系統更改成_ClassName__method_name

新的子類建立同名的方法或屬性也就沒有關係了,由於父類的雙下劃線屬性不能繼承

特殊的屬性__init__,在定義類的過程當中,__init__初始化方法是爲了綁定實例化對象後的必需要的屬性

class Student(object):
	def __init__(self, name, score):
		self.name = name
		self.score = score

Student()類實例化後必須有name和score屬性

相關文章
相關標籤/搜索