美文网首页
Python面向对象编程(进阶)(1)

Python面向对象编程(进阶)(1)

作者: Yznx_请叫我小哥 | 来源:发表于2019-04-16 22:13 被阅读0次

限制属性绑定

当我们定义了一个类后,我们可以给实例绑定一个属性,就算是类里面没有定义也是可以的,就像是这样:


image.png

然后我们还是同样可以绑定一个方法:

def test(self):
    print("test...")
from types import MethodType
human.test = MethodType(test, human)
human.test()
------
test...

我们是只给一个实例绑定了一个方法,所以是只对这一个实例有效。如果我们想给每一个实例都绑定那么不用说就是给类绑定方法,我们先看一下给类绑定对象:

def test_class(self):
    print("now test class...")
Human.test_class = test_class

然后来看一下我们上面所创建的第一个实例human有这个方法吗?:

human.test_class()
------
now test class...

同时我们再新建一个实例看一下:

human1 = Human()
human1.test_class()
------
now test class...

也是可以的。
那么如果我们想要限制属性绑定怎么办?为了达到限制的目的,Python允许在定义class的时候,定义一个特殊的slots变量,来限制该class实例能添加的属性:

class Human(object):
     __slots__ = ('name', 'age') # 用tuple定义允许绑定的属性名称

现在你的实例是只可以绑定这两个属性了,如果绑定其他的就会报错:

human.sex = "Boy"
huma.sex
------
NameError                                 Traceback (most recent call last)
<ipython-input-26-0c9130d826b3> in <module>
      1 human.sex = "Boy"
----> 2 huma.sex
NameError: name 'huma' is not defined

使用slots要注意,slots定义的属性仅对当前类实例起作用,对继承的子类是不起作用的,除非在子类中也定义slots,这样,子类实例允许定义的属性就是自身的slots加上父类的slots

使用@property装饰器

我们先定义一个类,类里面有一个年龄的私有属性,通过初始化设置年龄:

class Student(object):
   def __init__(self, age):
        self.age = age

按照之前的方法,我们可以使用“get/set”来获得它的值和修改它的值,这样是不是有点不方便,如果想要很简单的操作能不能呢?而且人的年龄是有限制的啊,不能小于0大于500(目前还没有发现超过500岁的人吧),所以如果在设置年龄的时候能不能有所限制呢?是可以的,我们可以通过装饰器来实现。

class Student(object):
    def __init__(self, age):
        self.age = age
    
    @property
    def age(self):
        return self._age
    
    @age.setter
    def age(self, age):
         if not isinstance(age, int):
            raise ValueError('score must be an integer!')
         if age < 0 or age > 500:
            raise ValueError('age must between 0 ~ 500!')
         self._age = age
    
s = Student(20)
s.age
------
20

然后我们通过使用“.”来修改

s.age = 30
s.age
------
30

在这个程序里面,你会发现一个细节,那就是我们在return的时候使用另外一个变量名来命名的,如果不这样做,你会发现会报错。

相关文章

网友评论

      本文标题:Python面向对象编程(进阶)(1)

      本文链接:https://www.haomeiwen.com/subject/qrviwqtx.html