摘要:方法綁定方法多重繼承實(shí)例化實(shí)現(xiàn)了方法和實(shí)例的綁調(diào)用綁定方法非綁定方法在子類中,父類的方法就是非綁定方法,因?yàn)樵谧宇愔校瑳]有建立父類的實(shí)例,卻要是用父類的方法。
類 創(chuàng)建類
第一形式
# !/usr/bin/env python # coding=utf-8 class Person(object): #object表示繼承自object類,Python3中可省略次內(nèi)容 """ This is a sample of Class """ breast = 90 #類的屬性 是靜態(tài)變量 def __init__(self, name): #初始化方法 self為對(duì)象實(shí)例本身 self.name = name def get_name(self): #類的方法 return self.name def color(self,color): d = {} d[self.name] = color; return d if __name__ == "__main__": girl = Person("songjia") print girl.name girl.name ="liu" print girl.get_name() print girl.color("white") girl.breast = 80 #修改實(shí)例的屬性 print girl.breast print Person.breast #類屬性不會(huì)隨實(shí)例屬性的改變而改變 Person.breast = 100 print Person.breast print girl.breast
第二種形式
>>> __metaclass__ = type >>> class CC: ... pass ... >>> cc = CC() >>> cc.__class__實(shí)例>>> type(cc)
girl = Person("songjia")類屬性
>>> class A(object): #Python 3: class A: ... x = 7 #類的屬性 ...
下面列出類的幾種特殊屬性的含義:
C.__name__:以字符串的形式,返回類的名字,注意這時(shí)候得到的僅僅是一個(gè)字符串,它不是一個(gè)類對(duì)象
C.__doc__:顯示類的文檔
C.__base__:類C的所有父類。如果是按照上面方式定義的類,應(yīng)該顯示object,因?yàn)橐陨纤蓄惗祭^承了它。等到學(xué)習(xí)了“繼承”,再來看這個(gè)屬性,內(nèi)容就豐富了
C.__dict__:以字典形式顯示類的所有屬性
C.__module__:類所在的模塊
實(shí)例屬性>>> class A(object): #Python 3: class A: ... x = 7 #類的屬性 ... >>> foo = A() >>> foo.x #實(shí)例屬性類中變量引用可變數(shù)據(jù)
>>> class B(object): ... y = [1, 2, 3] >>> B.y #類屬性 [1, 2, 3] >>> bar = B() >>> bar.y #實(shí)例屬性 [1, 2, 3] >>> bar.y.append(4) >>> bar.y [1, 2, 3, 4] >>> B.y [1, 2, 3, 4] >>> B.y.append("aa") >>> B.y [1, 2, 3, 4, "aa"] >>> bar.y [1, 2, 3, 4, "aa"]
當(dāng)類中變量引用的是可變對(duì)象是,類屬性和實(shí)例屬性都能直接修改這個(gè)對(duì)象,從而影響另一方的值。
訪問限制# !/usr/bin/env python # coding=utf-8 class Person(object): """ This is a sample of Class """ def __init__(self, name): #初始化方法 self為對(duì)象實(shí)例本身 self.__name = name #__xx雙下劃線表示類的私有變量 def get_name(self): #類的方法 return self.__name #類的內(nèi)部可以訪問 if __name__ == "__main__": girl = Person("songjia") print girl.get_name() print girl._name #無法訪問類的私有變量文檔字符串
在函數(shù)、類或者文件開頭的部分寫文檔字符串說明,一般采用三重引號(hào)。這樣寫的最大好處是能夠用help()函數(shù)看。
"""This is python lesson""" def start_func(arg): """This is a function.""" pass class MyClass: """This is my class.""" def my_method(self,arg): """This is my method.""" pass繼承 單繼承
#!/usr/bin/env python # coding=utf-8 class Person(object): #Python 3: class Person: def __init__(self, name): self.name = name def height(self, m): h = dict((["height", m],)) return h def breast(self, n): b = dict((["breast", n],)) return b class Girl(Person): #繼承 def get_name(self): return self.name if __name__ == "__main__": cang = Girl("liuguoquan") print cang.get_name() #Python 3: print(cang.get_name()),下同,從略 print cang.height(160) print cang.breast(90)調(diào)用覆蓋的方法
class Girl(Person): def __init__(self, name): #Person.__init__(self, name) #調(diào)用父類的方法 super(Girl, self).__init__(name) #調(diào)用父類的方法常用寫法 self.real_name = "Aoi sola" def get_name(self): return self.name if __name__ == "__main__": cang = Girl("canglaoshi") print cang.real_name print cang.get_name() print cang.height(160) print cang.breast(90) 執(zhí)行結(jié)果為: Aoi sola canglaoshi {"height": 160} {"breast": 90}多繼承
#!/usr/bin/env python # coding=utf-8 class Person(object): #Python 3: class Person: def eye(self): print "two eyes" def breast(self, n): print "The breast is: ",n class Girl(object): #Python 3: class Gril: age = 28 def color(self): print "The girl is white" class HotGirl(Person, Girl): #多重繼承 pass if __name__ == "__main__": kong = HotGirl() kong.eye() kong.breast(90) kong.color() print kong.age two eyes The breast is: 90 The girl is white 28多重繼承的順序-廣度優(yōu)先
class K1(object): #Python 3: class K1: def foo(self): print "K1-foo" #Python 3: print("K1-foo"),下同,從略 class K2(object): #Python 3: class K2: def foo(self): print "K2-foo" def bar(self): print "K2-bar" class J1(K1, K2): pass class J2(K1, K2): def bar(self): print "J2-bar" class C(J1, J2): pass if __name__ == "__main__": print C.__mro__ m = C() m.foo() m.bar() K1-foo J2-bar
代碼中的print C.__mro__是要打印出類的繼承順序。從上面清晰看出來了。如果要執(zhí)行foo()方法,首先看J1,沒有,看J2,還沒有,看J1里面的K1,有了,即C==>J1==>J2==>K1;bar()也是按照這個(gè)順序,在J2中就找到了一個(gè)。
這種對(duì)繼承屬性和方法搜索的順序稱之為“廣度優(yōu)先”。
Python 2的新式類,以及Python 3中都是按照此順序原則搜尋屬性和方法的。
#!/usr/bin/env python # coding=utf-8 class Person(object): #Python 3: class Person: def eye(self): print "two eyes" def breast(self, n): print "The breast is: ",n class Girl(object): #Python 3: class Gril: age = 28 def color(self): print "The girl is white" class HotGirl(Person, Girl): #多重繼承 pass if __name__ == "__main__": kong = HotGirl() #實(shí)例化實(shí)現(xiàn)了方法和實(shí)例的綁 kong.eye() #調(diào)用綁定方法非綁定方法
在子類中,父類的方法就是非綁定方法,因?yàn)樵谧宇愔校瑳]有建立父類的實(shí)例,卻要是用父類的方法。
靜態(tài)方法和類方法#!/usr/bin/env python # coding=utf-8 __metaclass__ = type class StaticMethod: #靜態(tài)方法 @staticmethod def foo(): print "This is static method foo()." class ClassMethod: #類方法 @classmethod def bar(cls): #類方法必須有cls參數(shù) print "This is class method bar()." print "bar() is part of class:", cls.__name__ if __name__ == "__main__": static_foo = StaticMethod() #實(shí)例化 static_foo.foo() #實(shí)例調(diào)用靜態(tài)方法 StaticMethod.foo() #通過類來調(diào)用靜態(tài)方法 print "********" class_bar = ClassMethod() class_bar.bar() ClassMethod.bar() This is static method foo(). This is static method foo(). ******** This is class method bar(). bar() is part of class: ClassMethod This is class method bar(). bar() is part of class: ClassMethod
在python中:
@staticmethod表示下面的方法是靜態(tài)方法
@classmethod表示下面的方法是類方法
多態(tài)和封裝 多態(tài)class Cat: def speak(self): print "meow!" class Dog: def speak(self): print "woof!" class Bob: def bow(self): print "thank you, thank you!" def speak(self): print "hello, welcome to the neighborhood!" def drive(self): print "beep, beep!" def command(pet): pet.speak() pets = [ Cat(), Dog(), Bob() ] for pet in pets: command(pet)
Python中的多態(tài)特點(diǎn),Python不檢查傳入對(duì)象的類型,這種方式被稱之為“隱式類型”(laten typing)或者“結(jié)構(gòu)式類型”(structural typing),也被通俗的稱為“鴨子類型”(duck typeing),Python是弱類型語言。
Java會(huì)檢查傳入對(duì)象的類型,所以是強(qiáng)類型語言。
封裝和私有化要了解封裝,離不開“私有化”,就是將類或者函數(shù)中的某些屬性限制在某個(gè)區(qū)域之內(nèi),外部無法調(diào)用。
Python中私有化的方法也比較簡單,就是在準(zhǔn)備私有化的屬性(包括方法、數(shù)據(jù))名字前面加雙下劃線。例如:
#!/usr/bin/env python # coding=utf-8 class ProtectMe(object): #Python 3: class ProtectMe: def __init__(self): self.me = "qiwsir" self.__name = "kivi" #私有變量 def __python(self): #私有方法 print "I love Python." def code(self): print "Which language do you like?" self.__python() if __name__ == "__main__": p = ProtectMe() print p.me print p.code()如何將一個(gè)方法變成屬性調(diào)用?
可以使用property函數(shù)。
#!/usr/bin/env python # coding=utf-8 class ProtectMe(object): #Python 3: class ProtectMe: def __init__(self): self.me = "qiwsir" self.__name = "kivi" #私有變量 def __python(self): #私有方法 print "I love Python." @property def code(self): print "Which language do you like?" self.__python if __name__ == "__main__": p = ProtectMe() print p.me print p.code #調(diào)用方法名即可
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/38203.html
摘要:以下這些項(xiàng)目,你拿來學(xué)習(xí)學(xué)習(xí)練練手。當(dāng)你每個(gè)步驟都能做到很優(yōu)秀的時(shí)候,你應(yīng)該考慮如何組合這四個(gè)步驟,使你的爬蟲達(dá)到效率最高,也就是所謂的爬蟲策略問題,爬蟲策略學(xué)習(xí)不是一朝一夕的事情,建議多看看一些比較優(yōu)秀的爬蟲的設(shè)計(jì)方案,比如說。 (一)如何學(xué)習(xí)Python 學(xué)習(xí)Python大致可以分為以下幾個(gè)階段: 1.剛上手的時(shí)候肯定是先過一遍Python最基本的知識(shí),比如說:變量、數(shù)據(jù)結(jié)構(gòu)、語法...
摘要:楚江數(shù)據(jù)是專業(yè)的互聯(lián)網(wǎng)數(shù)據(jù)技術(shù)服務(wù),現(xiàn)整理出零基礎(chǔ)如何學(xué)爬蟲技術(shù)以供學(xué)習(xí),。本文來源知乎作者路人甲鏈接楚江數(shù)據(jù)提供網(wǎng)站數(shù)據(jù)采集和爬蟲軟件定制開發(fā)服務(wù),服務(wù)范圍涵蓋社交網(wǎng)絡(luò)電子商務(wù)分類信息學(xué)術(shù)研究等。 楚江數(shù)據(jù)是專業(yè)的互聯(lián)網(wǎng)數(shù)據(jù)技術(shù)服務(wù),現(xiàn)整理出零基礎(chǔ)如何學(xué)爬蟲技術(shù)以供學(xué)習(xí),http://www.chujiangdata.com。 第一:Python爬蟲學(xué)習(xí)系列教程(來源于某博主:htt...
摘要:,同為小白的朋友們大家好,這期主要為大家?guī)碛嘘P(guān)字典的一些實(shí)用技巧。上篇筆記通過感人肺腑的老白讓大家認(rèn)識(shí)到了字典這么有用的數(shù)據(jù)類型,這一期讓我們看看如何能更好的操作字典。 Hello ,同為小白的朋友們大家好,這期主要為大家?guī)碛嘘P(guān)字典的一些實(shí)用技巧。上篇筆記通過感人肺腑的老白讓大家認(rèn)識(shí)到了字典這么有用的數(shù)據(jù)類型,這一期讓我們看看如何能更好的操作字典。 基礎(chǔ)篇 下面我給大家來一個(gè)簡單的...
摘要:勤學(xué)學(xué)習(xí)效率與效果取決于執(zhí)行力。這一步學(xué)習(xí)的正確姿勢(shì)是在實(shí)踐操作中發(fā)掘問題,然后帶著問題找答案。拆分任務(wù)將目標(biāo)分解成具體可執(zhí)行的學(xué)習(xí)任務(wù)。勤學(xué)強(qiáng)大的執(zhí)行力是學(xué)習(xí)的根本保障。分享復(fù)述檢驗(yàn)學(xué)習(xí)成果,提高學(xué)習(xí)效果的最好方法。 showImg(https://segmentfault.com/img/bVbcPGZ?w=256&h=256); 前段時(shí)間和大家一起分享了一篇關(guān)于學(xué)習(xí)方法內(nèi)容《大牛...
摘要:什么是推導(dǎo)式大家好,今天為大家?guī)韱栁易钕矚g的推導(dǎo)式使用指南,讓我們先來看看定義推導(dǎo)式是的一種獨(dú)有特性,推導(dǎo)式是可以從一個(gè)數(shù)據(jù)序列構(gòu)建另一個(gè)新的數(shù)據(jù)序列的結(jié)構(gòu)體。 什么是推導(dǎo)式 大家好,今天為大家?guī)韱栁易钕矚g的Python推導(dǎo)式使用指南,讓我們先來看看定義~ 推導(dǎo)式(comprehensions)是Python的一種獨(dú)有特性,推導(dǎo)式是可以從一個(gè)數(shù)據(jù)序列構(gòu)建另一個(gè)新的數(shù)據(jù)序列的結(jié)構(gòu)體。...
閱讀 3403·2023-04-26 02:41
閱讀 2445·2023-04-26 00:14
閱讀 2823·2021-08-11 10:22
閱讀 1275·2019-12-27 11:38
閱讀 3571·2019-08-29 18:34
閱讀 2375·2019-08-29 12:13
閱讀 2951·2019-08-26 18:26
閱讀 1834·2019-08-26 16:49