获得对象信息、实例变量与类变量
廖雪峰老师的python教程
拿到对象判断类型的方法
1.type()函数
基本类型和函数都可通过type()函数判断
type(123)
#<class 'int'>
type(abs)
#<class 'builtin_function_or_method'>
2.isinstance()函数
对于class的继承与类的判断,使用type()不再方便,可以使用isinstance()
可以用type()判断,就可以被isinstance()判断
3.dir()函数
想要获得一个对象的所有属性与方法,可以使用此方法
4.get/set/hasattr()函数
顾名思义,三个函数的意义为:
getattr():获取属性
setattr():设置属性
hasattr():判断是否有属性
hasattr(obj, 'x') # 有属性'x'吗?
#True
obj.x
#9
hasattr(obj, 'y') # 有属性'y'吗?
#False
setattr(obj, 'y', 19) # 设置一个属性'y'
hasattr(obj, 'y') # 有属性'y'吗?
#True
getattr(obj, 'y') # 获取属性'y'
#19
obj.y # 获取属性'y'
#19
因为python作为动态语言有其特殊性,即有时候在定义类的属性时容易被篡改,这就涉及到了实例属性与类属性的问题
给实例绑定属性的方式是通过实例变量,或者通过self变量。
类属性是直接在class中定义的变量。
class Student(object):
def __init__(self, name):
self.name = name
name2 = 'Student'
再引入一条因类属性与实例属性混淆而带来的案例:
class Student(object):
name = 'Student'
s = Student() # 创建实例s
print(s.name) # 打印name属性,因为实例并没有name属性,所以会继续查找class的name属性
#Student
print(Student.name) # 打印类的name属性
#Student
s.name = 'Michael' # 给实例绑定name属性
print(s.name) # 由于实例属性优先级比类属性高,因此,它会屏蔽掉类的name属性
#Michael
print(Student.name) # 但是类属性并未消失,用Student.name仍然可以访问
#Student
del s.name # 如果删除实例的name属性
print(s.name) # 再次调用s.name,由于实例的name属性没有找到,类的name属性就显示出来了
#Student
所以道理很简单,避免变量混淆