博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

python3学习笔记 静态方法,类方法,属性方法

Posted on 2018-04-19 18:00  NLFD123  阅读(140)  评论(0)    收藏  举报

在继承关系中,如果一个实例的数据类型是某个子类,那它的数据类型也可以被看做是父类。但是,反过来就不行:

判断类型: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实例添加nameage属性。

为了达到限制的目的,Python允许在定义class的时候,定义一个特殊的__slots__变量,来限制该class实例能添加的属性:

class Student(object):
    __slots__ = ('name', 'age') # 用tuple定义允许绑定的属性名称

使用__slots__要注意,__slots__定义的属性仅对当前类实例起作用,对继承的子类是不起作用的: