在继承关系中,如果一个实例的数据类型是某个子类,那它的数据类型也可以被看做是父类。但是,反过来就不行:
判断类型:isinstance
a = Animal() d = Dog() h = Husky() >>> isinstance(h, Husky) True >>> isinstance(h, Dog) True >>> isinstance(h, Animal) True >>> isinstance(d, Husky) False
并且还可以判断一个变量是否是某些类型中的一种,比如下面的代码就可以判断是否是list或者tuple:
>>> isinstance([1, 2, 3], (list, tuple)) True >>> isinstance((1, 2, 3), (list, tuple)) True
仅仅把属性和方法列出来是不够的,配合getattr()、setattr()以及hasattr(),我们可以直接操作一个对象的状态:
class Ass(object): def __init__(self): self.x=9 a=Ass() print(hasattr(a,'x')) True print(hasattr(a,'y')) False setattr(a,'y',19) print(hasattr(a,'y')) True print(getattr(a,'y')) 19
静态方法@statitmetod
只是名义上归类管理,实际上在静态方法里访问不了类或实例中的任何属性
类方法@classmethed
只能访问类变量,不能访问实例变量
属性方法@property
把一个方法变成一个静态属性
class Student(object): @property def score(self): return self._score @score.setter def score(self, value): if not isinstance(value, int): raise ValueError('score must be an integer!') if value < 0 or value > 100: raise ValueError('score must between 0 ~ 100!') self._score = value
s.score = 60 # OK,实际转化为s.set_score(60)
s.score # OK,实际转化为s.get_score()
@property广泛应用在类的定义中,可以让调用者写出简短的代码,同时保证对参数进行必要的检查,这样,程序运行时就减少了出错的可能性。

删除
@del.deleter
def eat(self):
del self.__food
类其实继承的是type:

类的生成 调用 顺序依次是 __new__ --> __init__ --> __call__
__slots__
如果我们想要限制实例的属性怎么办?比如,只允许对Student实例添加name和age属性。
为了达到限制的目的,Python允许在定义class的时候,定义一个特殊的__slots__变量,来限制该class实例能添加的属性:
class Student(object): __slots__ = ('name', 'age') # 用tuple定义允许绑定的属性名称
使用__slots__要注意,__slots__定义的属性仅对当前类实例起作用,对继承的子类是不起作用的:
浙公网安备 33010602011771号