python获取url参数 类继承_python之类的继承
在繼承當(dāng)中我們將父類(lèi)稱(chēng)為:父類(lèi),基類(lèi),超類(lèi)
將子類(lèi)稱(chēng)為:子類(lèi),派生類(lèi),繼承類(lèi)
子類(lèi)和父類(lèi)是is的關(guān)系。
假如:p1是父類(lèi)的一個(gè)實(shí)例,我們可以說(shuō)p1是父類(lèi),但是不能說(shuō)是子類(lèi)。
p2是子類(lèi)的一個(gè)實(shí)例,我們能說(shuō)p2是子類(lèi),也能說(shuō)p2是父類(lèi)。
>>> classPerson(object):def __init__(self,name,gnder):
self.name=name
self.gender=gender>>> classStudent(Person):def __init__(self,name,gender,school,score):
super(Student,self).__init__(name,gender)
self.school=school
self.score= score
這里面就是Student從Person父類(lèi)繼承了,這里要注意的是
super(Student,self).__init__(name,gender)是一個(gè)用來(lái)初始化父類(lèi)的語(yǔ)句
————————————————————————————————————————————————————
判斷類(lèi)型:
函數(shù)isinstance()可以判斷一個(gè)變量的類(lèi)型,既可以用在Python內(nèi)置的數(shù)據(jù)類(lèi)型如str、list、dict,也可以用在我們自定義的類(lèi),它們本質(zhì)上都是數(shù)據(jù)類(lèi)型。
>>> classPerson(object):def __init__(self,name,gender):
self.name=name
self.gender=gender>>> classStudent(Person):def __init__(self,name,gender,score):
super(Student,self).__init__(name,gender)
self.score=score>>> classTeacher(Person):def __init__(self,name,gender,course):
super(Teacher,self).__init__(name,gender)
self.course=course>>> p = Person('Tim','Male')>>> s = Student('Bob','Male',88)>>> t = Teacher('Alice','Female','English')>>>isinstance(s,Person)
True>>>isinstance(s,Student)
True>>>isinstance(s,Teacher)
False
從上面的返回結(jié)果可以看出,s屬于person類(lèi)和student類(lèi),但是不屬于teahcer類(lèi)。
——————————————————————————————————————————
多態(tài)性:
>>> classPerson(object):def __init__(self,name,gender):
self.name=name
self.gender=gender>>> classPerson(object):def __init__(self,name,gender):
self.name=name
self.gender=genderdefwhoAmI(self):return 'I am a Person,my name is %s' %self.name>>> classStudent(Person):def __init__(self,name,gender,score):
super(Student,self).__init__(name,gender)
self.score=scoredefwhoAmI(self):return 'I am a Student,my name is %s' %self.name>>> classTeacher(Person):def __init__(self,name,gender,course):
super(Teacher,self).__init__(name,gender)
self.course=coursedefwhoAmI(self):return'I am a Teacher,my name is %s'%self.name>>> defwho_am_i(x):printx.whoAmI()
SyntaxError: invalid syntax>>> defwho_am_i(x):print(x.whoAmI())>>> p = Person('Tim','Male')>>> s = Student('Bob','Male',88)>>> t = Teacher('Alice','Female','English')>>>who_am_i(p)
I am a Person,my nameisTim>>>who_am_i(s)
I am a Student,my nameisBob>>>who_am_i(t)
I am a Teacher,my nameis Alice
這種行為稱(chēng)為多態(tài)。也就是說(shuō),方法調(diào)用將作用在?x?的實(shí)際類(lèi)型上。s?是Student類(lèi)型,它實(shí)際上擁有自己的whoAmI()方法以及從 Person繼承的 whoAmI方法,但調(diào)用?s.whoAmI()總是先查找它自身的定義,如果沒(méi)有定義,則順著繼承鏈向上查找,直到在某個(gè)父類(lèi)中找到為止。
由于Python是動(dòng)態(tài)語(yǔ)言,所以,傳遞給函數(shù)?who_am_i(x)的參數(shù)?x不一定是 Person 或 Person 的子類(lèi)型。任何數(shù)據(jù)類(lèi)型的實(shí)例都可以,只要它有一個(gè)whoAmI()的方法即可:
這是動(dòng)態(tài)語(yǔ)言和靜態(tài)語(yǔ)言(例如Java)最大的差別之一。動(dòng)態(tài)語(yǔ)言調(diào)用實(shí)例方法,不檢查類(lèi)型,只要方法存在,參數(shù)正確,就可以調(diào)用。
——————————————————————————————————————————————————————————————————
多重繼承:
子類(lèi)可以從多個(gè)父類(lèi)繼承。
>>> classA(object):def __init__(self,a):print ('init A...')
self.a=a>>> classB(A):def __init__(self,a):
super(B,self).__init__(a)print ('init B...')>>> classC(A):def __init__(self,a):
super(C,self).__init__(a)print('init C...')>>> classD(B,C):def __init__(self,a):
super(D,self).__init__(a)print ('init D...')>>> d = D('d')
init A...
init C...
init B...
init D...
多重繼承的目的是從兩種繼承樹(shù)中分別選擇并繼承出子類(lèi),以便組合功能使用。
舉個(gè)例子,Python的網(wǎng)絡(luò)服務(wù)器有TCPServer、UDPServer、UnixStreamServer、UnixDatagramServer,而服務(wù)器運(yùn)行模式有?多進(jìn)程ForkingMixin和?多線(xiàn)程ThreadingMixin兩種。
要?jiǎng)?chuàng)建多進(jìn)程模式的TCPServer:
classMyTCPServer(TCPServer, ForkingMixin)pass
要?jiǎng)?chuàng)建多線(xiàn)程模式的UDPServer:
classMyUDPServer(UDPServer, ThreadingMixin):pass
如果沒(méi)有多重繼承,要實(shí)現(xiàn)上述所有可能的組合需要 4x2=8 個(gè)子類(lèi)。
————————————————————————————————————————————————
獲取對(duì)象信息:
我們獲取對(duì)象信息除了isinstance()之外還有type():
>>> classD(B,C):def __init__(self,a):
super(D,self).__init__(a)print ('init D...')>>> d = D('d')
init A...
init C...
init B...
init D...>>> type(123)
>>>type(d)
其次,可以用?dir()函數(shù)獲取變量的所有屬性:
>>> dir(123)
['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__', '__delattr__', '__dir__', '__divmod__', '__doc__', '__eq__', '__float__', '__floor__', '__floordiv__', '__format__', '__ge__', '__getattribute__', '__getnewargs__', '__gt__', '__hash__', '__index__', '__init__', '__int__', '__invert__', '__le__', '__lshift__', '__lt__', '__mod__', '__mul__', '__ne__', '__neg__', '__new__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__round__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'bit_length', 'conjugate', 'denominator', 'from_bytes', 'imag', 'numerator', 'real', 'to_bytes']>>>dir(d)
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'a']
dir()返回的屬性是字符串列表,如果已知一個(gè)屬性名稱(chēng),要獲取或者設(shè)置對(duì)象的屬性,就需要用?getattr()和setattr( )函數(shù)了:
>>> classStudent(object):def __init__(self,name):
self.name=name>>> a = Student('Dean')>>> getattr(a,'name')'Dean'
>>> setattr(a,'name','Adam')>>>a.name'Adam'
>>> getattr(a,'age') #獲取age屬性,但是屬性不存在,報(bào)錯(cuò):
Traceback (most recent call last):
File"", line 1, in getattr(a,'age') #獲取age屬性,但是屬性不存在,報(bào)錯(cuò):
AttributeError: 'Student' object has no attribute 'age'
>>> getattr(s, 'age', 20) #獲取age屬性,如果屬性不存在,就返回默認(rèn)值20:
20
總結(jié)
以上是生活随笔為你收集整理的python获取url参数 类继承_python之类的继承的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 金融行业信息系统信息安全等级保护实施指引
- 下一篇: python实训报告pygame_[源码