通常情况下,当我们定义了一个class,创建了一个class的实例后,我们可以给该实例绑定任何属性和方法,这就是动态语言的灵活性。下来我就讲下添加属性和方法,同时也将下限值添加属性方法。
添加属性
给一个实例添加属性和方法时,只有对象能使用,对类添加方法和属性时,为类属性和类方法
>>> class Peopre(object): """docstring for Peopre""" def __init__(self): pass ... ... ... ... ... >>> p=Peopre()>>> Peopre.__dict__mappingproxy({'__module__': '__main__', '__doc__': 'docstring for Peopre', '__init__':, '__dict__': , '__weakref__': })>>> p.__dict__{}# -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-# 对实例添加属性>>> p.name='张三'>>> p.name'张三'>>> Peopre.__dict__mappingproxy({'__module__': '__main__', '__doc__': 'docstring for Peopre', '__init__': , '__dict__': , '__weakref__': })# -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-# 对类添加属性,添加的为类属性>>> Peopre.name='name'>>> Peopre.age='12'>>> Peopre.__dict__mappingproxy({'__module__': '__main__', '__doc__': 'docstring for Peopre', '__init__': , '__dict__': , '__weakref__': , 'name': 'name', 'age': '12'})>>> p1=Peopre()>>> p1.name'name'>>> p1.age'12'>>> p.name'张三'
添加方法
>>> class Peopre(object): """docstring for Peopre""" def __init__(self): pass... ... ... ... >>> def hi(): print("你好")... ... >>> Peopre.__dict__mappingproxy({'__module__': '__main__', '__doc__': 'docstring for Peopre', '__init__':, '__dict__': , '__weakref__': })# -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-# 添加的方法为类方法>>> Peopre.hi=hi>>> Peopre.__dict__mappingproxy({'__module__': '__main__', '__doc__': 'docstring for Peopre', '__init__': , '__dict__': , '__weakref__': , 'hi': })>>> Peopre.hi >>> Peopre.hi()你好>>> def hello():... print("hello!")... >>> p = Peopre()>>> p.hi >>>> p.hi()Traceback (most recent call last): File " ", line 1, in TypeError: hi() takes 0 positional arguments but 1 was given# -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*- # 添加的为普通方法>>> p.hello = hello>>> p.hello()hello!>>> p.__dict__{'hello': }>>>
删除属性、方法
删除的方法:
- del 对象.属性名
- delattr(对象, "属性名")
>>> class Peopre(object): """docstring for Peopre""" def __init__(self, name): self.name = name def hi(self): print("我的名字是:%s"%self.name)... ... ... ... ... ... >>> p = Peopre("张三")>>> p.hi()我的名字是:张三>>> p.__dict__{'name': '张三'}>>> del(p.name)>>> p.__dict__{}# 删除方法>>> Peopre.__dict__mappingproxy({'__module__': '__main__', '__doc__': 'docstring for Peopre', '__init__':, 'hi': , '__dict__': , '__weakref__': })>>> def hello():... print("你好")... >>> Peopre.hello = hello>>> Peopre.__dict__mappingproxy({'__module__': '__main__', '__doc__': 'docstring for Peopre', '__init__': , 'hi': , '__dict__': , '__weakref__': , 'hello': })>>> del(Peopre.hello)>>> Peopre.__dict__mappingproxy({'__module__': '__main__', '__doc__': 'docstring for Peopre', '__init__': , 'hi': , '__dict__': , '__weakref__': })>>>
__slots__
限制该class能添加的属性. 但__slots__
定义的属性仅对当前类起作用,对继承的子类是不起作用的.
>>> class Peopre(object): """docstring for Peopre""" __slots__ = ("name","age")... ... ... >>> p = Peopre>>> p = Peopre()>>> p.name= "张三">>> p.age= 14>>> p.height = 170Traceback (most recent call last): File "", line 1, in AttributeError: 'Peopre' object has no attribute 'height'# 对继承的子类是不起作用的>>> class Test(Peopre): pass ... ... ... >>> t = Test()>>> t.height = 170>>>