发布于2019-08-08 10:28 阅读(564) 评论(0) 点赞(2) 收藏(5)
在面向对象的程序设计中有两种重要概念:
定义类的语法格式如下:
1 2 3 4 | class 类名: 执行语句 零到多个类变量 零到多个类方法 |
例如我们需要制作一只碗,首先需要这个碗的模型就是类,在制作这个碗的过程就叫做实例化,制作出来的碗就是实例、对象;这个碗在中国制作,就是类变量;而这个碗的颜色、材料就是这个类的实例变量,具体请看下面代码:
1 2 3 4 5 6 7 8 9 10 11 | class BowlModel: make_in = 'China' # 类变量,不需要实例化就调用 def __init__( self ,colour = 'red' ,material = 'lron' ): # __init__方法一般用来对实例的属性进行初始化 # 下面两个是实例变量 self .colour = colour self .material = material print ( '颜色:' , self .colour, '材料:' , self .material) # 定义make方法 def make( self ,name): print (name, '制作了一只' , self .colour, self .material, '碗。' ) |
关于网上一些说__init__是构造函数,一些说__new__才是真正的构造函数,这里找了一些资料大致解析如下:
老式类中其实并没有 __new__ 方法,因为 __init__ 就是它的构造方法(函数)。
新式类允许开发者根据他们的意图来重写 __new__ 和 __init__ 方法。__new__ (构造函数)单独地创建一个对象,而 __init__ (初始化函数)负责初始化这个对象。
创建对象时,实际是调用了__new__方法,返回当前对象的一个实例,当实例被创建出来后,会调用__init__方法,对当前对象的实例初始化,没有返回值。
创建对象例:
1 2 3 4 5 6 7 8 9 10 11 12 | # 调用BowlModel的构造方法,返回一个BowlModel对象 # 在创建实例对象时,__ini__执行了一次 # 将BowlModel对象赋值给a变量 a = BowlModel() ''' 这里在执行时,过程可以理解为: a = object.__new__(BowlModel) print (a) # 返回当前对象的实例,打印 <__main__.BowlModel object at 0x0000000002E2CCC0> print (BowlModel.__init__(a)) # 执行了一次__init__方法,打印 颜色: red 材料: lron 返回 None ''' print (a) # 打印 <__main__.BowlModel object at 0x0000000002E2CD68> |
当创建完对象之后,就可以对对象的实例变量进行操作(增、删、改、查),也可以调用和增加对象的方法。
具体语法如下:
1 2 | 对象.方法(参数) 对象.变量 |
对对象的实例变量进行增、删、改、查如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | # 访问对象的变量 print (BowlModel.make_in) print (a.make_in) # 访问a实例,直接为colour实例变量赋值 a.colour = 'green' print ( vars (a)) # 返回当前范围局部变量的字典,打印 {'colour': 'green', 'material': 'lron'} # 输出a的material实例变量 print (a.material) # 打印 lron # 为a对象动态增加factory实例变量 a.factory = '陶瓷厂' print ( vars (a)) # 打印 {'colour': 'green', 'material': 'lron', 'factory': '陶瓷厂'} # 使用del语句,动态删除a对象的factory实例变量 del a.factory print ( vars (a)) # 打印 {'colour': 'green', 'material': 'lron'} |
调用对象的方法例:
1 2 | # 调用a对象的make方法,因为第一参数是自动绑定的,只需要为第二个参数传入一个值 a.make( '老王' ) # 打印 老王 制作了一只 green lron 碗。 |
为对象动态增加方法,例:
1 2 3 4 5 6 7 8 9 | def company( self ,company_name): print (company_name, '在制作一只' , self .colour, self .material, '碗。' ) a.cy = company #print (a.cy('大大陶瓷厂')) # 报错 TypeError: company() missing 1 required positional argument: 'company_name' # 由于Pyhon不会自动将调用者绑定到第一个参数self,故需要手动将调用者绑定到第一个参数 a.cy(a, '大大陶瓷厂' ) # 打印 大大陶瓷厂 在制作一只 green lron 碗。 |
当然也可以利用lambda表达式为a对象动态增加方法,例:
1 2 3 4 | a.use = lambda self ,people : print (people, '正在使用一只' , self .colour, self .material, '碗。' ) # 同样需要手动将调用者绑定到第一个参数 a.use(a, '大明' ) # 打印 大明 正在使用一只 green lron 碗。 |
如果想让a对象动态增加的方法自动绑定第一个参数,可以使用types模块下的MethodType进行包装,例:
1 2 3 4 5 6 7 | test = lambda self ,tester : print (tester, '正在测试一只' , self .colour, self .material, '碗。' ) from types import MethodType # 使用MethodType对test进行包装,将第一个参数自动绑定为a a.test = MethodType(test,a) a.test( '小宗' ) # 打印 小宗 正在测试一只 green lron 碗。 |
作者:343ueru
链接:https://www.pythonheidong.com/blog/article/13321/1233524938fe28e9201c/
来源:python黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 python黑洞网 All Rights Reserved 版权所有,并保留所有权利。 京ICP备18063182号-1
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!