python_笔记14_创建类的实例(支持多属性),方法也是属性
来源:互联网 发布:吉林顺通网络是传销吗 编辑:程序博客网 时间:2024/05/07 06:30
请定义Person类的__init__方法,除了接受 name、gender 和 birth 外,还可接受任意关键字参数,并把他们都作为属性赋值给实例。
?不会了怎么办
要定义关键字参数,使用 **kw;
除了可以直接使用self.name = 'xxx'设置一个属性外,还可以通过 setattr(self, 'name', 'xxx') 设置属性。
参考代码:
方法也是属性
我们在 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
?不会了怎么办
要定义关键字参数,使用 **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
- python_笔记14_创建类的实例(支持多属性),方法也是属性
- python_静态属性,类方法,静态方法
- 学习笔记_实例属性和类属性
- Python 面向对象编程基础(定义类并创建实例、创建实例属性、初始化实例属性、访问限制、类属性、属性名冲突、实例方法、类方法)
- 25-python_类的属性-对象的属性
- js属性和方法的可见性:私有属性(方法),实例属性(方法),类属性(方法)
- python进阶学习笔记(四)——python中访问限制、创建类属性、定义实例方法、定义类方法、类的继承
- python中方法也是属性
- python进阶学习笔记(五)——创建实例属性、初始化实例属性
- 波哥学JAVA,定义类 声明属性 创建对象 实例化对象 对象调用属性或者方法
- iOS开发-OC中属性创建需要注意的地方(property实例变量的创建和标准存取方法)
- iOS开发-OC中属性创建需要注意的地方(property实例变量的创建和标准存取方法)
- python_类的实例化
- 创建类需创建的方法及属性
- python的类属性和实例属性
- python的类属性和实例属性
- python 的 类属性 与 实例属性
- python的类属性和实例属性
- 完美长方体是不可能存在的 第一章
- Python第三章-字符串
- GEEK编程练习— —最长相同的子串
- R语言
- VNC轻松连接远程Linux桌面
- python_笔记14_创建类的实例(支持多属性),方法也是属性
- handler用法
- 设计模式学习--建造者模式
- awk对数据排序实例
- 男生必学,与女生聊天技巧
- 推荐系统概述
- 图像识别---opencv安装
- nyoj 水池数目(dfs)
- 重建二叉树