Python面向对象学习之类属性的限定

版权声明: 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那一行即可。

猜你喜欢

转载自blog.csdn.net/qq_37457432/article/details/87937675