python - 面向对象(一)

 

python是一门面向对象的编程语言,python中的一切均是对象。
有对象就提到类,对象和类就像是儿子和老子的关系,是不可分的一对。

什么是类
    类就是具有一些共同特性的事物的统称。好比人类,共有的特性是能说话、能走路、要吃饭、睡觉等共同特性
什么是对象
    对象是类的实体,除了有人类的共有特性外也可能还有个体特性,比如两个人张三、李四就是两个不同的对象。

1、类的定义

class 类名称()

# 定义一个people类
class People():
        pass

python中的类定义分为经典类和新式类,不过这种分类方式是正对python2.x来说的,在python3.x中定义的所有类默认都是新式类

# 经典类定义
class ClassidClass():
    pass

# 新式类定义
class NewClass(object):
    pass

 虽然在python3中都是新式类,但为了程序的规范,定义类时都采用新式类定义的方法定义类

2、对象的定义

严格说对象不是定义的,而是实例化来的。

# 定义类
class People(object):
    pass

# 实例化对象
zhangsan = People()

3、类成员

类的成员分为:字段、属性、方法

 

字段:
   当创建完一个类后,系统就在内存中分配一块地址用来保存类信息,当实例化一个对象时,系统会再次开辟一块内存空间用来保存实例化的对象信息,但在实例化对象时,仅将类中的普通字段加载到对象的内存空间,其它的所有类成员地址都保存在类的内存空间中。

换言之:
普通字段属于对象,在所有对象中都保存一份,通过对象访问
静态字段属于类,保存在类中,通过类访问

访问规则:
# 普通字段只能使用对象访问
# 静态字段用类访问(万不得已的时候可以使用对象访问)

方法:

简单的说就是类中定义的函数就是类方法。这个函数和普通的非类中的函数有什么区别呢?类函数(方法)只能被类或类的实例化对象访问,其它对象无法访问。而普通函数可以被任何对象访问。
在类的方法中有一种比较特殊的方法 init() ,这个交构造函数。当类中有此方法是,实例化一个对象时将自动调用该函数。

属性:

和类方法一样,只是在函数的上面多了一个@property装饰器,只要加了这个装饰器名,就成为一个属性。属性在调用时可以不用加括号,而且属性是没有参数的。而方法需要加括号。

以下为类的所有成员及调用例子:

# 定义类
class People(object):
    # 静态字段
    country = "china"

    # 构造函数
    def __init__(self, name):
        # 普通字段
        self.name = name

    # 方法
    def talk(self):
        print("{0} 说话".format(self.name))

    # 属性
    @property
    def drink(self):
        print("{0} 喝水".format(self.name))

# 实例化对象
zhangsan = People("张三")
print(zhangsan.name)
# 方法调用
zhangsan.talk()
# 属性调用
zhangsan.drink

对象zhangsan在实例化时只是将普通字段copy一份到新的内存空间,其它所有属性及方法都存在类空间中。

4、对象方法调用

既然属性及方法存在类中,那么对象调用 talk()方法、drink方法时是如何调用的呢,图中看到对象实例化时存了一份类的地址指针。当调用talk()方法时,实质是:

zhangsan.talk() = People.talk(zhangsan)

这就要说到self到底是个什么东西:

 其实从上面讲到的可以看到,self其实就是zhangsan这个对象本身。

方法分类
类方法分为3类:

类的方法分为:普通方法、 静态方法和类方法

 调用方式特征
普通方法 由对象去调用执行,属于类 至少一个self,对象调用
静态方法 属于类,但通过类来调用,不依赖于任何对象,方法内部不需要对象封装的值时,可使用静态方法 任意参数,没有self,上面添加@staticmethod,类似装饰器的东东
类方法 静态方法的一种特殊形式,由类调用 至少一个cls参数,上面添加classmethod


普通方法: 至少有一个 self 默认参数,由实例化对象调用。无任何装饰器.
普通方法可以访问对象属性,也可以访问类属性。

类方法: 至少有一个 cls 默认参数 , 由类调用。有@classmethod装饰器。
类方法只能访问类属性,无法访问对象属性

静态方法: 没有默认参数,由类调用。有@staticmethod装饰器。 只能访问静态方法中定义的变量。
无法访问类属性,也无法访问对象属性

# 定义类
class People(object):
    # 静态字段
    country = "china"

    # 构造函数
    def __init__(self, name):
        # 普通字段
        self.name = name

    # 普通方法
    def talk(self):
        print("{0} 说话".format(self.name))

    # 静态方法
    @staticmethod
    def eat():
        print("静态方法")

    # 类方法
    @classmethod
    def class_walk(cls):
        print("类方法:走路")

    # 属性
    @property
    def drink(self):
        print("{0} 喝水".format(self.name))

# 实例化对象
zhangsan = People("张三")
print(zhangsan.name)
# 普通方法调用
zhangsan.talk()
# 类方法调用
People.class_walk()
# 静态方法
People.eat()

属性
属性定义方式: 普通方法加@property装饰器
属性功能: 实现一些内部计算或逻辑处理,调用时可以实现和字段一样的效果
属性特性: 普通方法一样定义,但区别是只有一个默认参数 self

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

p = Goods()
# 调用
print(p.price)  # 80.0

属性的@property装饰其实是一个类,这个类构造时有4个参数:

property(fget=None, fset=None, fdel=None, doc=None) -> property attribute

fget,fset,fdel分别是3个函数用来实现对类字段的属性值进行操作获取值、设置值、删除值
doc 是描述信息
还是上面的例子,我们改变一下:

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.deleter
    def price(self):
        del self.original_price



good = Goods()
print(good.price)  # 获取商品实际价格 调用fget方法  = 80.0
good.price = 200   # 调整商品原价为200,调用fset方法
print(good.price)  # =160.0
del good.price     # 调用fdel方法, 删除了类字段 
print(good.price)  # AttributeError: 'Goods' object has no attribute 'original_price' 

 本文参考:http://blog.csdn.net/songfreeman/article/details/50738367

posted @ 2016-07-26 06:23  unixfbi.com  阅读(207)  评论(0编辑  收藏  举报