码迷,mamicode.com
首页 > 编程语言 > 详细

Python之路【第五篇】:面向对象编程二

时间:2015-12-12 06:54:58      阅读:268      评论:0      收藏:0      [点我收藏+]

标签:

技术分享

类成员

一、字段

字段包括:普通字段和静态字段,他们在定义和使用中有所区别,而最本质的区别是内存中保存的位置不同

普通字段属于对象

静态字段属于

 技术分享

#!/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

 

Python之路【第五篇】:面向对象编程二

标签:

原文地址:http://www.cnblogs.com/luotianshuai/p/5040566.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!