码迷,mamicode.com
首页 > 编程语言 > 详细

Python:面向对象编程2

时间:2019-11-10 11:58:41      阅读:82      评论:0      收藏:0      [点我收藏+]

标签:imp   报告   下划线   就会   ESS   自己的   attribute   col   失败   

如何在class创建后,给实例绑定属性和方法? (动态绑定/定义)

class Student(object):
    pass

s = Student()
s.name = Michael # 动态给实例绑定一个属性

def set_age(self, age): # 定义一个函数作为s的实例方法
    self.age = age

from types import MethodType

s.set_age = MethodType(set_age, s) # 给实例绑定一个方法

 

??但这些方法/属性是这个实例特有的。如果要所有实例都能使用的话,可以这样:

Student.set_score = set_score

 

如此,就给Student绑定了一个方法。它的所有实例都可以调用。

解释一下:

动态定义方法,就是在代码开始运行后,通过定义一个新方法并绑定到已经定义的类或实例对象上,让类的所有实例或实例自身可以使用它。

 

??Ruby的动态定义方法使用define_method(symbol, method)或define_method(symbol){block}->symbol。

它的主要作用是在运行时决定方法的名字。这里比较不太合适。

 

但是,我们想要Student的实例的属性不能随意添加,必须限制,怎么做? ??

使用__slots__

class Student(object):
    __slot__ = (name, age)

 

如果再想要,给实例添加其他属性就会报告?AttributeError

 

 

使用@property

给类的实例添加属性。

首先,一个对一个实例属性的正常操作包括写入和读取,即要两个方法。

class Student(object):

    def get_score(self):
         return self._score

    def set_score(self, value):
        self._score = value

 

但这么写很费劲,而且调用的时候,不能直接使用属性的名字score。

Python也没有类似Ruby的写法:??下面代码是模仿Ruby。Ruby的 "name="也可以是方法名,并且有了赋值的功能。

class Student(object):

    def score(self):
         return self._score

    def score=(self, value):
        self._score = value
s = Student()
s.score = 11
print(s.score)

 

 

所以说很费劲。因此Python使用了自己的方法,这就是装饰器(decorator)的方法:@property

class Student(object):

    @property
    def score(self):
        return self._score

    @score.setter
    def score(self, value):
        self._score = value

 

>>> s = Student()
>>> s.score = 60 # OK,实际转化为s.set_score(60)
>>> s.score # OK,实际转化为s.get_score()
60

 

相当于score定义外面加了一层或几层定义def,这种代码的写法叫做装饰器

@property相当于加上读方法,@xxx.setter相当于加上写方法。 

 

??Ruby更简单直接用attr_accessor(symbol)来完成读写方法的定义。

例子:

  1. ??self._xxxx。加上一个下划线
  2. resolution是一个只读属性。他的内部是用self._width * self._height。
  3. 如果设resolution为一个普通方法,那么无法得到计算结果!!
class Screen(object):
    @property
    def width(self):
      return self._width

    @width.setter
    def width(self, value):
        self._width = value

    @property
    def height(self):
      return self._width

    @height.setter
    def height(self, a):
        self._height = a

    @property
    def resolution(self):
        a = self._width * self._height
        return a

s = Screen()
s.width = 1024
s.height = 768
print(resolution =, s.resolution)
if s.resolution == 786432:
    print(测试通过!)
else:
    print(测试失败!)

 

 

 

 

 

Python:面向对象编程2

标签:imp   报告   下划线   就会   ESS   自己的   attribute   col   失败   

原文地址:https://www.cnblogs.com/chentianwei/p/11829265.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!