python面向对象(二)——类成员
2016-04-11 11:19
591 查看
Python面向对象 类成员
![](https://images2015.cnblogs.com/blog/773921/201604/773921-20160411105857504-1375259354.png)
1、字段
普通字段 属于对象静态字段 属于类
2、方法
普通方法触发者是对象 括号里至少一个参数 self = 当前对象 ,可以有多个参数
类方法
@classmethod (cls=当前类) 触发者是类,用类直接调用,括号里只能有一个参数cls
对静态方法的约束,只能有一个参数,参数在传值的时候自动把当前类传入。单例模式时用到。
静态方法
属于类 @staticmethod 触发者类,括号里不需要参数(),也可以有多个参数
类加上静态方法=一个函数 。创建对象就可以访问方法,就像创建了函数。如果程序全部要求用面向对象做,而不用函数,静态方法才有用。
为什么要有类方法和静态方法?
因为如果没有这两种方法,在调用时就会先创建对象在去调用方法。而这两种方法都可以直接通过类来调用,节省的内存。
class foo(): def func(self): print "This is common method" @classmethod #类方法 def class_func(cls): #参数为cls print "This is class method!!!" @staticmethod #静态方法 def static_method(): print "This is static method!!" obj = foo() obj.func() #用对象直接调用普通方法 foo.class_func() #通过类来直接调用类方法 foo.static_method() #通过类来直接调用静态方法
3、属性
属性把一个方法伪造成一个字段、一个属性,像字段那样的属性而不是一个功能定义时,在普通方法的基础上添加 @property 装饰器;
定义时,属性仅有一个self参数
调用时,无需括号
普通方法:foo_obj.func()
属性方法:foo_obj.prop
属性的两种定义方式
装饰器 即:在方法上应用装饰器
静态字段 即:在类中定义值为property对象的静态字段
[b] [b][b]装饰器方式:在类的普通方法上应用@property装饰器[/b][/b][/b]
经典类,具有一种@property装饰器(如上一步实例)
# ############### 定义 ############### class Goods: @property def price(self): return"wupeiqi" # ############### 调用 ############### obj = Goods() result = obj.price # 自动执行 @property 修饰的 price 方法,并获取方法的返回值
新式类,具有三种@property装饰器
# ############### 定义 ############### class Goods(object): @property def price(self): print'@property' @price.setter def price(self, value): print'@price.setter' @price.deleter def price(self): print'@price.deleter' # ############### 调用 ############### obj = Goods() obj.price # 自动执行 @property 修饰的 price 方法,并获取方法的返回值 obj.price = 123 # 自动执行 @price.setter 修饰的 price 方法,并将 123 赋值给方法的参数 del obj.price # 自动执行 @price.deleter 修饰的 price 方法
由于新式类中具有三种访问方式,我们可以根据他们几个属性的访问特点,分别将三个方法定义为对同一个属性:获取、修改、删除
class Goods(object): def__init__(self): # 原价 self.original_price = 100 # 折扣 self.discount = 0.8 @property def price(self): # 实际价格 = 原价 * 折扣 new_price = self.original_price * self.discount return new_price @price.setter def price(self, value): self.original_price = value @price.deltter def price(self, value): del self.original_price obj = Goods() obj.price # 获取商品价格 obj.price = 200 # 修改商品原价 del obj.price # 删除商品原价
[b] 静态字段方式,创建值为property对象的静态字段[/b]
[b] 当使用静态字段的方式创建属性时,经典类和新式类无区别[/b]
class Foo: def get_bar(self): return 'wupeiqi' BAR = property(get_bar) obj = Foo() reuslt = obj.BAR # 自动调用get_bar方法,并获取方法的返回值 print reuslt
[b] property的构造方法中有个四个参数
[/b]
第一个参数是方法名,调用
对象.属性时自动触发执行方法
第二个参数是方法名,调用
对象.属性 = XXX时自动触发执行方法
第三个参数是方法名,调用
del 对象.属性时自动触发执行方法
第四个参数是字符串,调用
对象.属性.__doc__,此参数是该属性的描述信息
class Foo: def get_bar(self): return'wupeiqi' # *必须两个参数 def set_bar(self, value): return 'set value' + value def del_bar(self): return'wupeiqi' BAR = property(get_bar, set_bar, del_bar, 'description...') obj = Foo() obj.BAR # 自动调用第一个参数中定义的方法:get_bar obj.BAR = "alex" # 自动调用第二个参数中定义的方法:set_bar方法,并将“alex”当作参数传入 del Foo.BAR # 自动调用第三个参数中定义的方法:del_bar方法 obj.BAE.__doc__ # 自动获取第四个参数中设置的值:description...
由于静态字段方式创建属性具有三种访问方式,我们可以根据他们几个属性的访问特点,分别将三个方法定义为对同一个属性:获取、修改、删除
class Goods(object): def__init__(self): # 原价 self.original_price = 100 # 折扣 self.discount = 0.8 def get_price(self): # 实际价格 = 原价 * 折扣 new_price = self.original_price * self.discount return new_price def set_price(self, value): self.original_price = value def del_price(self, value): del self.original_price PRICE = property(get_price, set_price, del_price, '价格属性描述...') obj = Goods() obj.PRICE # 获取商品价格 obj.PRICE = 200 # 修改商品原价 del obj.PRICE # 删除商品原价
相关文章推荐
- python学习笔记4(对象/引用;多范式; 上下文管理器)
- UnicodeEncodeError: ‘ascii’ codec can’t encode characters in position xxx ordinal...
- 【教程】七步精通Python机器学习
- cannot import name 'Flask' 的错误
- python-面向对象(一)——开篇基础
- 【转】zhihu图片下载工具
- 求素数 -- Python实现
- python 新手入门学习(一)
- Python3:正则表达式
- Python-OpenCV(6)
- 一道简单的填空题
- Python的递推式构造列表(List comprehension)
- windows下python安装Numpy、Scipy、matplotlib模块
- ubuntu14.04 改变系统默认Python解释器
- python setup.py uninstall
- .pth 文件扩展python环境路径
- 初学python(对比java语言不同) 第五篇
- python监控进程
- python学习笔记(excel+unittest)
- 如何使python2.7的程序与python3.x的兼容