前言
养成一个好的习惯只需要坚持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
# 测试通过!