版权声明: https://blog.csdn.net/qq_37457432/article/details/87937675
我们在上一部分中写了一个简单的Python类以及在另一个文件中实例化的栗子。
但是由于类属性没有任何的封装,而且其他方法可能会引入新的属性,因此代码耦合性较高
我们对类属性进行限定,则类中的属性只包括限定的那几个,别的方法进行添加属性时编译无法通过。
Python中对其进行限定是使用__slots__('Par_A','Par_B')
在不加slots之前,我们可以看到:在run中新加了length这个属性
class Dog(object):
def __init__(self,name,kind,level):#构造函数,定义属性和初始方法
self.name=name
self.kind=kind
self.level=level#赋值
print(f"This is a {self.kind} dog called {self.name} with level {self.level}")
def run(self):#定义类中的方法
self.length=100
print(f"{self.name} is now running!")
def roll_over(self):
print(f"{self.name} is now rolling over!")
def change_level(self):
self.level+=1#修改类中属性的值
print(f"The level of {self.name} is now {self.level}")
我们在另一个类中进行调用查看
from Zoo.Dog import Dog#导包
dog=Dog("Halo","Husty",3)#实例化
dog.run()
dog.roll_over()
dog.change_level()#调用方法
print(dog.length)
发现如下结果
This is a Husty dog called Halo with level 3
Halo is now running!
Halo is now rolling over!
The level of Halo is now 4
100
因此我们加上 __slots__ = ('name', 'kind','level')进行限定,即如图
class Dog(object):
__slots__ = ('name', 'kind', 'level')
def __init__(self,name,kind,level):#构造函数,定义属性和初始方法
self.name=name
self.kind=kind
self.level=level#赋值
print(f"This is a {self.kind} dog called {self.name} with level {self.level}")
def run(self):#定义类中的方法
self.length=100
print(f"{self.name} is now running!")
def roll_over(self):
print(f"{self.name} is now rolling over!")
def change_level(self):
self.level+=1#修改类中属性的值
print(f"The level of {self.name} is now {self.level}")
再运行会发现,报错了。
Traceback (most recent call last):
This is a Husty dog called Halo with level 3
File "C:/Users/admin/PycharmProjects/TrainC01_1/Zoo/Husty.py", line 5, in <module>
dog.run()
File "C:\Users\admin\PycharmProjects\TrainC01_1\Zoo\Dog.py", line 10, in run
self.length=100
AttributeError: 'Dog' object has no attribute 'length'
删去length那一行即可。