-
Python的除法可以分為地板除(你沒看錯,就是地板)和普通除法,地板除的特殊方法是__floordiv__,普通除法是__truediv__。
地板除法和普通除法不一樣,地板除法的結果只會向下取整數。查看全部 -
__str__()函數似乎沒有在自定義類Person中生效,這是為什么呢?
這是因為 Python 定義了__str()__和__repr__()兩種方法,__str()__用于顯示給用戶,而__repr__()用于顯示給開發人員,當使用str()時,實際調用的是__str__()方法,而直接輸入變量,調用的是__repr__()方法。查看全部 -
通過type()函數,可以獲得變量的類型。
n?=?1 s?=?'this?is?a?string' type(n)?#?==>?<class?'int'> type(s)?#?==>?<class?'str'>
通過dir()方法,可以獲取變量的所有屬性:
>>>?n?=?1 >>>?dir(n) ['__abs__',?'__add__',?'__and__',?'__bool__',?'__ceil__',?'__class__',?'__delattr__',?'__dir__',?'__divmod__',?'__doc__',?'__eq__',?'__float__',?...] >>>?s?=?'this?is?a?string' >>>?dir(s) ['__add__',?'__class__',?'__contains__',?'__delattr__',?'__dir__',?'__doc__',?'__eq__',?'__format__',?'__ge__',?'__getattribute__',?'__getitem__',?'__getnewargs__',?'__gt__',?'__hash__',?'__init__',?'__init_subclass__',?'__iter__',?'__le__',?'__len__',?'__lt__',?'__mod__',?'__mul__',?'__ne__',?'__new__',?...]
在dir列出的屬性中,有很多是以下劃線開頭和結尾的,這些都是特殊的方法,稱為內建方法,在后面,我們還會學習這些方法。
dir()返回的屬性是字符串列表,如果已知一個屬性名稱,要獲取或者設置對象的屬性,就需要用 getattr() 和 setattr( )函數了。
>>>?getattr(p,?'name')?#?獲取name屬性 'Alice' >>>?setattr(p,?'name',?'Adam')?#?設置新的name屬性 >>>?s.name 'Adam'
查看全部 -
這時有必要去判斷數據的類型,通過函數isinstance()可以判斷一個變量的類型。
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')
當我們拿到變量 p、s、t 時,可以使用 isinstance 判斷類型:
>>>?isinstance(p,?Person) True?#?p是Person類型 >>>?isinstance(p,?Student) False?#?p不是Student類型 >>>?isinstance(p,?Teacher) False?#?p不是Teacher類型
這說明在繼承鏈上,一個父類的實例不能是子類類型,因為子類比父類多了一些屬性和方法。
s 是Student類型,不是Teacher類型,這很容易理解。但是,s 也是Person類型,因為Student繼承自Person,雖然它比Person多了一些屬性和方法,但是,把 s 看成Person的實例也是可以的。
isinstance也可以用于Python自有數據類型的判斷。
s?=?'this?is?a?string.' n?=?10 isinstance(s,?int)?#?==>?False isinstance(n,?str)?#?==>?False
查看全部 -
在定義Student類的時候,由于繼承了Person類,所以Student類自動擁有name、gender屬性,因此,在定義Student類的時候,只需要把額外的屬性加上即可。
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
在定義繼承類的時候,有幾點是需要注意的:
class Student()定義的時候,需要在括號內寫明繼承的類Person
在__init__()方法,需要調用super(Student, self).__init__(name, gender),來初始化從父類繼承過來的屬性
查看全部 -
在class中定義的全部是實例方法,實例方法第一個參數 self 是實例本身。
要在class中定義類方法,需要這么寫: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
和實例方法不同的是,這里有兩點需要特別注意:
類方法需要使用@classmethod來標記為類方法,否則定義的還是實例方法
類方法的第一個參數將傳入類本身,通常將參數名命名為 cls,上面的 cls.__localtion 實際上相當于Animal.__localtion。
? ??? ?因為是在類上調用,而非實例上調用,因此類方法無法獲得任何實例變量,只能獲得類的引用。
查看全部 -
私有屬性沒有辦法從外部訪問,只能在類的內部操作;那如果外部需要操作私有屬性怎么辦?這個時候可以通過定義類或者實例的方法來操作私有屬性.
class?Person(object): ????def?__init__(self,?name): ????????self.__name?=?name ????def?get_name(self): ????????return?self.__name
name是實例的私有屬性,從外部是無法訪問的,而get_name(self) 就是一個實例方法,在實例方法里面是可以操作私有屬性的,注意,它的第一個參數是self。
另外,__init__(self, name)其實也可看做是一個特殊的實例方法。
通過定義get_name(self)方法,在外部就可以通過這個方法訪問私有屬性了。p?=?Person('Alice') print(p.get_name())?#?==>?Alice
查看全部 -
通過input()函數,輸入的是字符串,需要轉型為數字類型。
查看全部 -
Python的sys.path返回的是一個路徑列表,因此可以操作列表里面的元素,請通過sys.path增加路徑'../',使得在運行時,可以導入當前目錄上級目錄的包。
import?sys sys.path.append('../')
查看全部 -
Python使用import語句導入一個模塊
如果希望導入模塊的指定部分屬性或函數,那么使用from...import...語句
如果希望導入模塊里面的所有內容,那么使用from ...import *語句。
如果從一個模塊導入函數,有可能會遇到導入的函數與本文件的函數沖突的情況。例如:本文件定義了一個pow()函數,同時從math模塊也導入了一個pow()函數,這種情況下就會引起沖突;事實上,這種沖突的情況經常發生。
有兩種方法可以解決這個問題,第一種是直接導入模塊,不指定導入模塊里面的具體內容;第二種方法就是使用from ... import as ...語句,as類似重命名,可以把導入的函數或屬性重命名為別的名字。查看全部 -
在Python中,函數其實是一個對象,我們可以將一個函數賦值給一個變量,而不改變函數的功能。
如果把一個類實例也變成一個可調用對象,可以實現一個特殊的方法__call__()。
查看全部 -
由于Python是動態語言,任何實例在運行期都可以動態地添加屬性。
如果要限制添加的屬性,就可以利用Python的一個特殊的__slots__來實現。
__slots__的目的是限制當前類所能擁有的屬性,避免因為外部屬性的操作導致類屬性越來越難以管理。
查看全部 -
如果一個類表現得像一個list,想使用len()函數來獲取元素個數時,則需要實現__len__()方法。
查看全部 -
Python 定義了__str()__和__repr__()兩種方法,__str()__用于顯示給用戶,而__repr__()用于顯示給開發人員,當使用str()時,實際調用的是__str__()方法,而直接輸入變量,調用的是__repr__()方法。
查看全部 -
類的特殊方法:
1. 雙下劃線開頭2.雙下劃線結束
3.每個Python對象都擁有特殊方法
查看全部
舉報