前言
養成一個好的習慣只需要堅持21天,Day10
獲取對象信息
判斷對象類型,可以使用type()
函數:
type(123)
# <class 'int'>
type('apple')
# <class 'str'>
type(None)
# <type(None) 'NoneType'>
如果一個變量指向函數或者類,也可以用type()
函數來判斷:
type(abs)
# <class 'builtin_function_or_method'>
types
模塊中有很多定義的常量:
import types
def fn():
pass
type(fn)==types.FunctionType
# True
type(lambda x:x)==types.LambdaType
# True
使用isinstance()
如果要判斷class的類型,可以使用isinstance()
函數。day9中在學習繼承和多態的時候其中的繼承關係是:
object -> Animal -> Dog
首先創建不同類的對象:
a = Animal()
d = Dog()
print(isinstance(d,Dog))
print(isinstance(d,Animal))
# True
# True
還可以直接判斷變量類型:
isinstance('abc',str)
# True
使用dir()
如果要獲得一個對象的所有屬性和方法,可以使用dir()函數,它返回一個包含字符串的list
,比如,獲得一個str
對象的所有屬性和方法:
dir('abc')
# ['__add__', '__class__',..., '__subclasshook__', 'capitalize', 'casefold',..., 'zfill']
通過dir()
得到的對象屬性,可以直接去調用,例如對象中包含有__len__()
方法:
print(len('abc'))
# 3
print('abc'.__len__())
# 3
對象的屬性和方法可以判斷獲知,配合getattr()
、setattr()
以及hasattr()
,我們可以直接操作一個對象的狀態:
class MyObject(object):
def __init__(self):
self.x = 9
def power(self):
return self.x * self.x
obj = MyObject
接下來使用getattr()
、setattr()
以及hasattr()
來測試對象的屬性:
hasattr(obj,'x')
# True
setattr(obj,'y',19)
hasattr(obj,'y')
# True
getattr(obj,'y')
# 19
實例屬性和類屬性
給實例綁定屬性的方法是通過實例變量,或者通過self變量:
class Student(objet):
def__init__(self,name):
self.name = name #通過self變量綁定name屬性
s = Student('Bob')
s.score = 90 # 通過實例變量綁定score屬性
如果想要給類綁定一個屬性,就可以直接在class類中定義屬性:
class Student(object):
name = 'Student'
接下來,測試類的屬性:
s = Student() # 創建實例s
print(s.name) # 打印name屬性,實例s沒有name屬性,就打印class類的name屬性
# Student
print(Sudent.name) # 打印類的name屬性
# Student
s.name = 'Tom' # 給實例定義name屬性
print(Srudent.name) # 類的name屬性並未改變
# Student
練習
爲了統計學生人數,可以給Student類增加一個類屬性,每創建一個實例,該屬性自動增加:
class Student(object):
count = 0
def __init__(self, name):
self.name = name
Student.count+=1
def get_count(object):
return object.count
# 測試:
if Student.count != 0:
print('測試失敗!')
else:
bart = Student('Bart')
if Student.count != 1:
print('測試失敗!')
else:
lisa = Student('Bart')
if Student.count != 2:
print('測試失敗!')
else:
print('Students:', Student.count)
print('測試通過!')
# Students: 2
# 測試通過!