零基础入门python3.7 ——基础知识总结(二十四)__slots__属性

我们可以动态的给单个实例对象添加属性。 甚至可以为所有的实例对象添加统一的属性。 同样的也可以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

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值