类成员
一、字段
字段包括:普通字段和静态字段,他们在定义和使用中有所区别,而最本质的区别是内存中保存的位置不同,
普通字段属于对象
静态字段属于类
#!/usr/bin/env python #-*- coding:utf-8 -*- class Dbcontrl(object): action = ‘contrl‘ def __init__(self,hostname,port,username,password,dbname,arg): self.hostname = hostname self.port = port self.username = username self.password = password self.dbname = dbname self.arg = arg def fetch(self): #连接数据库 hostname,prot,username,password,dbname #打开 #操作 #关闭 def modify(self): #连接数据库 hostname,prot,username,password,dbname #打开 #操作 #关闭 def remove(self): #连接数据库 hostname,prot,username,password,dbname #打开 #操作 #关闭 def create(self): #连接数据库 hostname,prot,username,password,dbname #打开 #操作 #关闭 obj1 = Dbcontrl(‘1.1.1.1‘,80,‘tianshuai‘,‘shuaige‘,‘testdb‘,[11,22,33,44,]) print obj1.dbname #普通字段的调用方法 Dbcontrl.action #静态字段的调用方法
由上述代码可以看出【普通字段需要通过对象来访问】【静态字段通过类访问】,在使用上可以看出普通字段和静态字段的归属是不同的。
静态字段属于类,且仅保留一份,普通字段保存在对象中!
二、方法
方法包含:普通方法、静态方法、类方法,他们在内存中都属于类,只是调用方式不同。
#!/usr/bin/env python #-*- coding:utf-8 -*- class Dbcontrl(object): action = ‘contrl‘ def __init__(self,hostname,port,username,password,dbname,arg): self.hostname = hostname self.port = port self.username = username self.password = password self.dbname = dbname self.arg = arg def modify(self): pass #连接数据库 hostname,prot,username,password,dbname #打开 #操作 #关闭 @staticmethod def tools_db(): pass """ 定义静态方法 ,无默认参数""" @classmethod def class_func(cls): pass """ 定义类方法,至少有一个cls参数 """ obj1 = Dbcontrl(‘1.1.1.1‘,80,‘tianshuai‘,‘shuaige‘,‘testdb‘,[11,22,33,44,]) obj1.modify() #调用普通方法 Dbcontrl.tools_db() #调用静态方法 Dbcontrl.class_func() #调用类方法
普通方法:由对象调用;至少一个self参数;执行普通方法时,自动将调用该方法的对象赋值给self;
比如:调用obj1.modify() 在调用的时候就相当于把对象赋值给方法:Dbcontrl.modify(obj1) 他的触发者是对象!
类方法:由类调用; 至少一个cls参数;执行类方法时,自动将调用该方法的类复制给cls;
类方法的触发者是类,当类在触发的时候,把自己当作参数传给cls = class
类方法很少用!
静态方法:由类调用;无默认参数;
其实你在类中使用静态方法:类+静态方法其实就等于一个函数!
触发者是类,常用于一个工具类,在调用的时候不需要实例化!举例来说有个工具类,如果是普通方法每次调用的都需要实例化,如果有非常非常多的人来调用难道每次都需要实例化吗?浪费内存空间,用静态方法那么你在调用的时候就不需要实例化他了!
三、属性
在python中属性的使用是非常少的,但是在其他的语言中属性用的非常多,因为在python中属性是后来才有的,他的功能目前还不是很强大!
但是他要告诉人们我也是支持属性的,所以才有了这个属性!
属性由方法变种而来,如果Python中没有属性,方法完全可以代替其功能。
属性存在意义是:访问属性时可以制造出和访问字段完全相同的假象
1、属性的基本使用
例子:摘自武老师的博客:
# ############### 定义 ############### class Pager: def __init__(self, current_page): # 用户当前请求的页码(第一页、第二页...) self.current_page = current_page # 每页默认显示10条数据 self.per_items = 10 @property def start(self): val = (self.current_page - 1) * self.per_items return val @property def end(self): val = self.current_page * self.per_items return val # ############### 调用 ############### p = Pager(1) p.start 就是起始值,即:m p.end 就是结束值,即:n
从上述可见,Python的属性的功能是:属性内部进行一系列的逻辑计算,最终将计算结果返回
2、属性的两种定义方式
属性的定义有两种方式:
装饰器 即:在方法上应用装饰器
静态字段 即:在类中定义值为property对象的静态字段
装饰器方式:在类的普通方法上应用@property装饰器
Python中的类有经典类和新式类,新式类的属性比经典类的属性丰富。( 如果类继object,那么该类是新式类 )
经典类 具有一种@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 方法
经典类中的属性只有一种访问方式,其对应被 @property 修饰的方法,新式类中的属性有三种访问方式,并分别对应了三个被@property、@方法名.setter、@方法名.deleter修饰的方法
静态字段方式,创建值为property对象的静态字段当使用静态字段的方式创建属性时,经典类和新式类无区别
class Foo: def get_bar(self): return ‘wupeiqi‘ BAR = property(get_bar) obj = Foo() reuslt = obj.BAR # 自动调用get_bar方法,并获取方法的返回值 print reuslt
property的构造方法中有个四个参数
- 第一个参数是方法名,调用
对象.属性
时自动触发执行方法 - 第二个参数是方法名,调用
对象.属性 = XXX
时自动触发执行方法 - 第三个参数是方法名,调用
del 对象.属性
时自动触发执行方法 - 第四个参数是字符串,调用
对象.属性.__doc__
,此参数是该属性的描述信息
class Foo: def get_bar(self): return ‘wupeiqi‘ # *必须两个参数 def set_bar(self, value): return 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...
所以,定义属性共有两种方式,分别是【装饰器】和【静态字段】,而【装饰器】方式针对经典类和新式类又有所不同。
部分内容摘自武老师的博客:http://www.cnblogs.com/wupeiqi/p/4766801.html