python_笔记14_创建类的实例(支持多属性),方法也是属性

来源:互联网 发布:吉林顺通网络是传销吗 编辑:程序博客网 时间:2024/05/07 06:30
请定义Person类的__init__方法,除了接受 name、gender 和 birth 外,还可接受任意关键字参数,并把他们都作为属性赋值给实例。
?不会了怎么办
要定义关键字参数,使用 **kw;
除了可以直接使用self.name = 'xxx'设置一个属性外,还可以通过 setattr(self, 'name', 'xxx') 设置属性。
参考代码:
#coding:utf-8class Person(object):def __init__(self,name,age,**kw):<span style="white-space:pre"></span>self.name = name<span style="white-space:pre"></span>self.age = age<span style="white-space:pre"></span>for k,v in kw.iteritems():<span style="white-space:pre"></span>setattr(self,k,v)<span style="white-space:pre"></span>p1 = Person('zys','aa',ceshi='z')print p1.name,p1.age,p1.ceshi


方法也是属性
我们在 class 中定义的实例方法其实也是属性,它实际上是一个函数对象:
class Person(object):
    def __init__(self, name, score):
        self.name = name
        self.score = score
    def get_grade(self):
        return 'A'
p1 = Person('Bob', 90)
print p1.get_grade
# => <bound method Person.get_grade of <__main__.Person object at 0x109e58510>>
print p1.get_grade()
# => A
也就是说,p1.get_grade 返回的是一个函数对象,但这个函数是一个绑定到实例的函数,p1.get_grade() 才是方法调用。
因为方法也是一个属性,所以,它也可以动态地添加到实例上,只是需要用 types.MethodType() 把一个函数变为一个方法:
import types
def fn_get_grade(self):
    if self.score >= 80:
        return 'A'
    if self.score >= 60:
        return 'B'
    return 'C'
class Person(object):
    def __init__(self, name, score):
        self.name = name
        self.score = score
p1 = Person('Bob', 90)
p1.get_grade = types.MethodType(fn_get_grade, p1, Person)
print p1.get_grade()
# => A
p2 = Person('Alice', 65)
print p2.get_grade()
# ERROR: AttributeError: 'Person' object has no attribute 'get_grade'
# 因为p2实例并没有绑定get_grade

给一个实例动态添加方法并不常见,直接在class中定义要更直观

-----------------------------------------------------------------------------------------------------------------------------

#coding:utf-8import typesclass Person(object):def __init__(self,score):self.__score = scoredef get_grade(self):L = {'A':u'优秀','B':u'及格','C':u'不及格'}for i in L.iteritems():if(i[0] == self.__score):return L[i[0]]def insertFun(self):return 'ceshi'p1 = Person('B')p1.insertFun = types.MethodType(insertFun,p1,Person)print p1.insertFun()



0 0
原创粉丝点击