-
函數(shù)isinstance()可以判斷一個(gè)變量的類(lèi)型。
>>> isinstance(s, Person)
True # s是Person類(lèi)型
>>> isinstance(s, Student)
True # s是Student類(lèi)型
>>> isinstance(s, Teacher)
False # s不是Teacher類(lèi)型查看全部 -
對(duì)人類(lèi)的抽象可以定義為Person類(lèi),而學(xué)生、老師等,也都是人類(lèi),所以,在Python當(dāng)中,如果定義學(xué)生Student的類(lèi),可以繼承Person類(lèi)。
接著定義Student類(lèi),在定義Student類(lèi)的時(shí)候,由于繼承了Person類(lèi),所以Student類(lèi)自動(dòng)擁有name、gender屬性,因此,在定義Student類(lèi)的時(shí)候,只需要把額外的屬性加上即可。
class Student(Person):
? ? def __init__(self, name, gender, score):
? ? ? ? super(Student, self).__init__(name, gender)
? ? ? ? self.score = score
student = Student('Alice', 'girl', 100)
print(student.name) # ==> Alice
print(student.gender) # ==> girl
print(student.score) # ==> 100
在定義繼承類(lèi)的時(shí)候,有幾點(diǎn)是需要注意的:
1. class Student()定義的時(shí)候,需要在括號(hào)內(nèi)寫(xiě)明繼承的類(lèi)Person
2. 在__init__()方法,需要調(diào)用super(Student, self).__init__(name, gender),來(lái)初始化從父類(lèi)繼承過(guò)來(lái)的屬性
查看全部 -
為了操作實(shí)例對(duì)象的私有屬性,我們定義了實(shí)例方法;同樣的,如果需要需要操作類(lèi)的私有屬性,則應(yīng)該定義類(lèi)的方法。
默認(rèn)的,在class中定義的全部是實(shí)例方法,實(shí)例方法第一個(gè)參數(shù) self 是實(shí)例本身。
要在class中定義類(lèi)方法,需要這么寫(xiě):
class Animal(object):
? ? __localtion = 'Asia'
? ? def __init__(self, name, age):
? ? ? ? self.name = name
? ? ? ? self.age = age
? ? @classmethod
? ? def set_localtion(cls, localtion):
? ? ? ? cls.__localtion = localtion
? ? @classmethod
? ? def get_localtion(cls):
? ? ? ? return cls.__localtion
print(Animal.get_localtion()) # ==> Asia
Animal.set_localtion('Afica')
print(Animal.get_localtion()) # ==> Africa
和實(shí)例方法不同的是,這里有兩點(diǎn)需要特別注意:
類(lèi)方法需要使用@classmethod來(lái)標(biāo)記為類(lèi)方法,否則定義的還是實(shí)例方法
類(lèi)方法的第一個(gè)參數(shù)將傳入類(lèi)本身,通常將參數(shù)名命名為 cls,上面的 cls.__localtion 實(shí)際上相當(dāng)于Animal.__localtion。
? ??? ?因?yàn)槭窃陬?lèi)上調(diào)用,而非實(shí)例上調(diào)用,因此類(lèi)方法無(wú)法獲得任何實(shí)例變量,只能獲得類(lèi)的引用。
總結(jié):
實(shí)例方法def 方法(self,); 類(lèi)方法def 方法(cls),且前面須加上@classmethod。
類(lèi)方法只能訪問(wèn)類(lèi)變量引用,不能訪問(wèn)實(shí)例內(nèi)的變量。
查看全部 -
把Animal類(lèi)的age、name、localtion定義成私有屬性,并定義對(duì)應(yīng)的方法修改和獲取他們的值。
class Animal(object):
? ?def __init__(self, name, age, localtion):
? ? ? ?self.__name = name
? ? ? ?self.__age = age
? ? ? ?self.__localtion = localtion
? ?def set_name(self, name):
? ? ? ?self.__name = name
? ?def get_name(self):
? ? ? ?return self.__name
? ?def set_age(self, age):
? ? ? ?self.__age = age
? ?def get_age(self):
? ? ? ?return self.__age
? ?def set_localtion(self, localtion):
? ? ? ?self.__localtion =localtion
? ?def get_localtion(self):
? ? ? ?return self.__localtionp=Animal("ww","12","we")
print(p.get_name(),p.get_age(),p.get_localtion())
注:本例中如果去除def set_name(self, name):等,程序也能正常運(yùn)行,待解。
?def get_info(self):
? ? ? ? return 'name = {}, age = {}, localtion = {}'.format(self.name, self.age, self.localtion)
這個(gè)語(yǔ)句可以同時(shí)取得多個(gè)屬性
查看全部 -
并不是所有的屬性都可以被外部訪問(wèn)的,這種不能被外部訪問(wèn)的屬性稱(chēng)為私有屬性。私有屬性是以雙下劃線(xiàn)'__'開(kāi)頭的屬性。
# 類(lèi)私有屬性
class Animal(object):
? ? __localtion = 'Asia'
print(Animal.__localtion)
Traceback (most recent call last):
? File "<stdin>", line 1, in <module>
AttributeError: type object 'Animal' has no attribute '__localtion'
# 實(shí)例私有屬性
class Animal(object):
? ?def __init__(self, name, age, localtion):
? ? ? ?self.name = name
? ? ? ?self.age = age
? ? ? ?self.__localtion = localtion
dog = Animal('wangwang', 1, 'GuangDong')
print(dog.name) # ==> wangwang
print(dog.age) # ==> 1
print(dog.__localtion)
Traceback (most recent call last):
?File "<stdin>", line 1, in <module>
AttributeError: 'Animal' object has no attribute '__localtion'查看全部 -
# Enter a code
class Animal(object):
? ? localtion = 'Asia'
? ? def __init__(self, name, age, localtion):
? ? ? ? self.name = name
? ? ? ? self.age = age
? ? ? ? self.localtion = localtion
dog = Animal('wangwang', 1, 'GuangDong')
print(dog.localtion)
print(Animal.localtion)
以上localtion為公共屬性
class Animal(object):
? ? __count = 0
? ? def __init__(self, name):
? ? ? ? Animal.__count = Animal.__count + 1
? ? ? ? self.name = name
? ? ? ? print(Animal.__count)
p1 = Animal('Cat')
p2 = Animal('Dog')
print(Animal.__count)
以上__count為私有屬性,實(shí)例不能訪問(wèn)
查看全部 -
class Animal(object):
? ? count = 0
? ? def __init__(self, name, age):
? ? ? ? self.name = name
? ? ? ? self.age = age
? ? ? ? Animal.count += 1
dog = Animal('wangwang', 1)
print(Animal.count)
cat = Animal('mimi', 3)
print(Animal.count)
pig = Animal('panpan', 1)
print(Animal.count)
請(qǐng)給 Animal類(lèi)添加一個(gè)類(lèi)屬性 count,每創(chuàng)建一個(gè)實(shí)例,count 屬性就加 1,這樣就可以統(tǒng)計(jì)出一共創(chuàng)建了多少個(gè) Animal的實(shí)例。
查看全部 -
在Python中,通過(guò)class關(guān)鍵字定義一個(gè)類(lèi),比如我們需要定義一個(gè)人的類(lèi)。按照 Python 的編程習(xí)慣,類(lèi)名以大寫(xiě)字母開(kāi)頭。因此可以這樣定義:
class Person: ?pass
注意,在這個(gè)Person類(lèi)的定義里面,并沒(méi)有繼承任何類(lèi),除了這樣定義以外,還可以有以下兩種定義方式。
class Person(): pass ?class Person(object): ?pass
這三種情況有什么區(qū)別呢?在Python3中,是沒(méi)有區(qū)別的,但是在Python2中,則有一定的區(qū)別。
在Python2中,對(duì)于第一種定義的方法,Person類(lèi)只有有限的幾個(gè)內(nèi)建函數(shù)'__doc__', '__module__', 'name',而對(duì)于第二種、第三種定義的方法,則會(huì)繼承Python object對(duì)象的更多的內(nèi)建函數(shù),可以更便捷的操作對(duì)象。這是Python2版本的差異。在Python3中,我們只需要知道這三種方式都可以定義一個(gè)類(lèi)即可。查看全部 -
請(qǐng)定義一個(gè)動(dòng)物類(lèi),抽象出名字、年齡兩個(gè)屬性,并實(shí)例化兩個(gè)實(shí)例dog, cat。
class Animal(object):
? ?def __init__(self, name, age):
? ? ? ?self.name = name
? ? ? ?self.age = age
dog = Animal('wangwang', 1)
cat = Animal('mimi', 3)
print(dog.name)
print(dog.age)
print(cat.name)
print(cat.age)需要注意的是,__init__() 方法的第一個(gè)參數(shù)必須是 self(也可以用別的名字,但建議使用習(xí)慣用法),后續(xù)參數(shù)則可以自由指定,和定義函數(shù)沒(méi)有任何區(qū)別。
定義類(lèi)后,就可以相應(yīng)的實(shí)例化對(duì)象了,需要注意的是,在實(shí)例化的時(shí)候,需要提供除self以外的所有參數(shù)。查看全部 -
斐波那契數(shù)列
查看全部 -
數(shù)學(xué)函數(shù)
查看全部 -
有必要注意的是,返回函數(shù)和返回函數(shù)值的語(yǔ)句是非常類(lèi)似的,返回函數(shù)時(shí),不能帶小括號(hào),而返回函數(shù)值時(shí),則需要帶上小括號(hào)以調(diào)用函數(shù)。
# 返回函數(shù)
def myabs():
? ?return abs
# 返回函數(shù)值
def myabs(x):
? ?return abs(x)查看全部 -
math 就相當(dāng)于一個(gè)工具箱,import math,相當(dāng)于把工具箱搬到家中了,但是你工具箱不打開(kāi)是用不了工具的?;蛘哒f(shuō)家里還有別的工具箱,你要用工具的話(huà),必須先找到對(duì)工具箱math,然后再用工具sin,所以用 math.sin().
sin()相當(dāng)于一件具體的工具,from math import sin,相當(dāng)于你直接從工具箱中拿出了工具,所以可以直接用。如:sin(100)
而 from math import * ,相當(dāng)于把工具箱工具一股腦倒在了地上,你可以直接用,想用哪一個(gè)就用哪一個(gè)。
查看全部 -
a=0
b=1
注意
a=b
b=a+b? ? ? ? ? ? ? ? 與 a,b = b,a+b 兩個(gè)句式的區(qū)別。
查看全部 -
Python判斷類(lèi)型
隨著我們學(xué)習(xí)步伐的前進(jìn),我們的程序會(huì)出現(xiàn)越來(lái)越多的類(lèi)型,有我們自己定義的類(lèi),也有Python自有的str、list、dict等,他們的本質(zhì)都是都是Python中的一種數(shù)據(jù)類(lèi)型,這時(shí)有必要去判斷數(shù)據(jù)的類(lèi)型,通過(guò)函數(shù)isinstance()可以判斷一個(gè)變量的類(lèi)型。
class Person(object): ? ? def __init__(self, name, gender): ? ? ? ? self.name = name ? ? ? ? self.gender = gender class Student(Person): ? ? def __init__(self, name, gender, score): ? ? ? ? super(Student, self).__init__(name, gender) ? ? ? ? self.score = score class Teacher(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')
當(dāng)我們拿到變量 p、s、t 時(shí),可以使用 isinstance 判斷類(lèi)型:
>>> isinstance(p, Person) True # p是Person類(lèi)型 >>> isinstance(p, Student) False # p不是Student類(lèi)型 >>> isinstance(p, Teacher) False # p不是Teacher類(lèi)型
這說(shuō)明在繼承鏈上,一個(gè)父類(lèi)的實(shí)例不能是子類(lèi)類(lèi)型,因?yàn)樽宇?lèi)比父類(lèi)多了一些屬性和方法。
我們?cè)倏疾?s:>>> isinstance(s, Person) True # s是Person類(lèi)型 >>> isinstance(s, Student) True # s是Student類(lèi)型 >>> isinstance(s, Teacher) False # s不是Teacher類(lèi)型
s 是Student類(lèi)型,不是Teacher類(lèi)型,這很容易理解。但是,s 也是Person類(lèi)型,因?yàn)镾tudent繼承自Person,雖然它比Person多了一些屬性和方法,但是,把 s 看成Person的實(shí)例也是可以的。
這說(shuō)明在一條繼承鏈上,一個(gè)實(shí)例可以看成它本身的類(lèi)型,也可以看成它父類(lèi)的類(lèi)型。
isinstance也可以用于Python自有數(shù)據(jù)類(lèi)型的判斷。
s = 'this is a string.' n = 10 isinstance(s, int) # ==> False isinstance(n, str) # ==> False
查看全部
舉報(bào)