我们可以动态的给单个实例对象添加属性。 甚至可以为所有的实例对象添加统一的属性。 同样的也可以i为类或实例对象动态的添加方法。而方法有分为实例方法。 静态方法和类方法。对于类来说这三种方法都可以添加。而对于实例对象来说只能添加实例方法。 不能添加静态方法和类方法。
- 为单个实例对象添加方法不会影响其他的实例对象
class Person:
name = "小张"
a = Person()
def getName(self):
print(self.name)
a.getName = getName
a.getName(a)
b = Person()
b.getName(b)
小张
Traceback (most recent call last):
File "/Users/apple/Documents/重要文件/python3/python21.py", line 11, in <module>
b.getName(b)
AttributeError: 'Person' object has no attribute 'getName'
- 为类动态添加方法则所有的实例对象都可以使用
class Person:
name = "小张"
a = Person()
def getName(self):
print(self.name)
@classmethod
def get_name(cls):
print(cls.name)
@staticmethod
def getname():
print("这是静态方法")
Person.getName = getName
Person.get_name = get_name
Person.getname = getname
a = Person()
a.getName()
a.get_name()
a.getname()
b = Person()
b.getName()
b.get_name()
b.getname()
小张
小张
这是静态方法
小张
小张
这是静态方法
- 即使是这样如果混乱的使用也会带来一定的隐患。程序中已经定义好的类 如果不做任何限制。是可以做修改的。 __slots__ 属性可以避免频繁的给实例对象添加属性和方法
class Person:
__slots__ = ("name", 'age')
表示只能给Person类的实例对象添加名name, age的属性和方法
class Person:
__slots__ = ("name", 'age')
a = Person()
a.name = "小张"
print(a.name)
a.city = "成都"
小张
Traceback (most recent call last):
File "/Users/apple/Documents/重要文件/python3/python21.py", line 8, in <module>
a.city = "成都"
AttributeError: 'Person' object has no attribute 'city'
class Person:
__slots__ = ("name", 'age')
a = Person()
def age(self):
self.age = 23
a.age = age
a.age(a)
print(a.age)
def add(self):
print("哈哈")
a.add = add
23
Traceback (most recent call last):
File "/Users/apple/Documents/重要文件/python3/python21.py", line 14, in <module>
a.add = add
AttributeError: 'Person' object has no attribute 'add'
- __slots__限制的是实例对象而不是类
class Person:
__slots__ = ("name", 'age')
@classmethod
def add(self):
print("哈哈")
Person.add = add
a = Person()
a.add()
哈哈
- __slots__对继承无效
class Person:
pass
__slots__ = ("name", 'age')
class Person1(Person):
tall = 180
a = Person1()
a.city = "成都"
print(a.city)
成都
- 要对子类的实例对象限制就要在子类中添加__slots__
class Person:
pass
__slots__ = ("name", 'age')
class Person1(Person):
tall = 180
__slots__ = ("city")
a = Person1()
a.city = "成都"
print(a.city)
a.school = "小学"
成都
Traceback (most recent call last):
File "/Users/apple/Documents/重要文件/python3/python21.py", line 12, in <module>
a.school = "小学"
AttributeError: 'Person1' object has no attribute 'school'
- 注意,如果为子类也设置有 __slots__ 属性,那么子类实例对象允许动态添加的属性和方法,是子类中 __slots__ 属性和父类 __slots__ 属性的和。
class Person:
pass
__slots__ = ("name", 'age')
class Person1(Person):
tall = 180
__slots__ = ("city")
a = Person1()
a.city = "成都"
print(a.city)
a.age = 100
print(a.age)
成都
100