本文共 1639 字,大约阅读时间需要 5 分钟。
对于静态语言(例如Java)来说,如果需要传入Animal
类型,则传入的对象必须是Animal
类型或者它的子类,否则,将无法调用run()
方法。
对于Python这样的动态语言来说,则不一定需要传入Animal
类型。我们只需要保证传入的对象有一个run()
方法就可以了:
type()
函数:返回参数类型
isinstance()
判断的是一个对象是否是该类型本身,或者位于该类型的父继承链上
如果要获得一个对象的所有属性和方法,可以使用dir()
函数,它返回一个包含字符串的list,比如,获得一个str对象的所有属性和方法:
>>> dir('ABC')['__add__', '__class__',..., '__subclasshook__', 'capitalize', 'casefold',..., 'zfill']
getattr(obj,属性):获取属性值
setattr(obj,属性):设置属性
hasattr(obj,属性):判断属性是否存在
>>> hasattr(obj, 'x') # 有属性'x'吗?True>>> obj.x9>>> hasattr(obj, 'y') # 有属性'y'吗?False>>> setattr(obj, 'y', 19) # 设置一个属性'y'>>> hasattr(obj, 'y') # 有属性'y'吗?True>>> getattr(obj, 'y') # 获取属性'y'19>>> obj.y # 获取属性'y'19
3.实例属性和类属性
类属性:直接在class中定义属性,这种属性是类属性,归Student
类所有:
class Student(object): name = 'Student'
实例属性:给实例绑定属性的方法是通过实例变量,或者通过self
变量:
class Student(object): def __init__(self, name): self.name = names = Student('Bob')s.score = 90
实例属性调用方法:实例对象.实例属性
类属性调用方法:类.实例属性 和 实例对象.实例属性
注意:千万不要对实例属性和类属性使用相同的名字,因为相同名称的实例属性将屏蔽掉类属性,但是当你删除实例属性后,再使用相同的名称,访问到的将是类属性。
如果实例属性和类属性使用相同的名字:那么s.name = 'Michael' # 给实例绑定name属性,由于实例属性优先级比类属性高,因此,它会屏蔽掉类的name属性,print(s.name) 就会变成Michael。但是类属性并未消失,用Student.name仍然可以访问,仍然是Student
4.特殊方法
__str__():重写该方法,print(Student('Michael'))可以打印
__repr__():
直接显示变量调用的不是__str__()
,而是__repr__(),所以重写__repr__()方法,可以改变直接调用变量的打印(直接调用变量代表:s = Student() print(s))
__call__:任何类,只需要定义一个__call__()
方法,就可以直接对实例进行调用
class Student(object): def __init__(self, name): self.name = name def __call__(self): print('My name is %s.' % self.name)调用方式如下:>>> s = Student('Michael')>>> s() # self参数不要传入My name is Michael
callable()
函数,我们就可以判断一个对象是否是“可调用”对象,也就是判断一个变量是对象还是函数呢
转载地址:http://hffgi.baihongyu.com/