python是动态语言,可以为实例动态绑定属性、方法,也可以为类动态绑定方法。即在用到的时候定义。为实例动态绑定的属性、方法,其它实例不可用。类绑定的方法,所有类实例都可以用。
class Animal(object):
def __init__(self, name, num):
self.name = name
self.num = num
def printNum(self):
print("%s有%s个" % (self.name, self.num))
d = Animal("哈士奇", 88)
动态给实例绑定属性
d.width = 90
print(d.width) ----------> 90
动态给实例绑定方法
def setLength(self, length):
self.length = length
from types import MethodType
d.setLength = MethodType(setLength, d)
d.setLength(99)
print(d.length) ----------> 99
动态给类绑定方法
def setColor(self, color):
self.color = color
Animal.setColor = setColor
d.setColor("black")
print(d.color) ----------> black
slots:
可以限制类实例绑定属性,实例只能绑定slots指定的属性
class Animal(object):
__slots__ = ("name", "num")
d = Animal()
d.name = "哈士奇"
print(d.name)
d.color = "black" #因为__slots__没有包括"color"属性,所以不可用
print(d.color)
image.png
slots对子类不起作用。但如果子类也定义了slots,则子类的实例属性是子类和父类的slots共同限制的。
class Cat(Animal):
pass
c = Cat()
c.color = "white"
print(c.color)
class Dog(Animal):
__slots__ = ("legth", "width")
dog = Dog()
dog.color = "yellow"
print(dog.color)
image.png