Fork me on GitHub

python学习第十四天 -面向对象编程基础

python也是支持面向对象编程的。这一章节主要讲一些python面向对象编程的一些基础。

什么是面向对象的编程?

1.面向对象编程是一种程序设计范式

2.把程序看做不同对象的相互调用

3.对现实世界建立对象模型

面向对象编程的基本思想:

1.类用于定义抽象类型

2.实例根据类的定义被创建出来

如何定义一个类并创建实例?

>>> class Animal(object):
    pass

>>> dog = Animal()
>>> cat = Animal()

何为实例属性

上面创建出了dog,cat实例。怎样让这些实例拥有在各自不同的属性?如果你家的dog有名字,或者cat有名字?

>>> class Animal(object):
    pass

>>> dog = Animal()
>>> dog.name = 'wangcai'
>>> cat = Animal()
>>> cat.name = 'beibei'

因为python是动态语言,可以直接为实例添加属性name。

有时候我们希望dog/cat在出生的时候,就可以拥有属性name。怎么做呢?

>>> class Animal(object):
    def __init__(self,name):
        self.name = name

        
>>> dog = Animal('wangcai')
>>> print dog.name
wangcai

当创建实例时,__init__()方法被自动调用,而第一个参数self被python解释器传入实例的引用。

我们有时候给一个实例绑定了很多属性,但是又不希望有些属性被外部直接访问怎么办?

访问限制

python对属性权限的控制是通过属性名实现的,如果一个由双下划线开头(__),该属性就无法被外部直接访问。类似于(private)

>>> class Animal(object):
    def __init__(self,name,birth):
        self.name = name
        self.__birth = birth

        
>>> dog = Animal('wangcai','2016-08-04')
>>> print dog.name
wangcai
>>> print dog.__birth

Traceback (most recent call last):
  File "<pyshell#100>", line 1, in <module>
    print dog.__birth
AttributeError: 'Animal' object has no attribute '__birth'

由单下划线开头的属性’_xxx‘可以被派生类子类访问。类型于(protected).

那么实例既然有属性,是否可以定义类的属性?

类属性

先说说类属性和实例属性的区别?

实例属性每个实例各自拥有,互相独立,而类属性有且只有一份。

>>> class Person(object):
    address = 'west'
    def __init__(self,name):
        self.name =name

        
>>> print Person.address
west
>>> p1 = Person('liunx')
>>> print p1.address
west

类属性只有一份,当Person类属性address改变时,所以的实例访问到的类属性都改变。

>>> Person.address = 'earth'
>>> p1.address
'earth'

但是如果类属性和实例属性名字冲突了怎么办?

>>> class Person(object):
    address = 'west'
    def __init__(self,name):
        self.name =name

>>> p1 = Person('liunx')
>>> p1.address = 'earth'//实例属性address
>>> print Person.address
west
>>> Person.address = 'west_1' //修改类属性
>>> print p1.address //实例属性不变,还是earch
earth

可见,当实例属性和类属性重名时,实例属性优先级高,它将屏蔽掉对类属性的访问

python的类属性可以类比为java中的静态变量。

有时候我们不希望实例的私有属性被外部直接显示调用。但是又希望在外部能被隐式调用。

 

定义实例方法

>>> class Animal(object):
    def __init__(self,name):
        self.__name = name
    def get_name(self):
        return self.__name

    
>>> dog = Animal('wangcai')

>>> print dog.get_name()
wangcai

这就是python面向对象数据封装的形式。保护内部数据的一致性。

既然实例有自己的方法,类也是有类方法。

定义类方法

>>> class Person(object):
    count = 0
    @classmethod
    def how_many(cls):
        return cls.count
    def __init__(self, name):
        self.name = name
        Person.count = Person.count + 1

        
>>> print Person.how_many()
0
>>> p1 = Person('liunx')
>>> print Person.how_many()
1

通过标记一个@classmethod,就可以将方法绑定到Person类上,而非类的实例。类方法的第一个参数将传入类本身。上面的cls.count相当于Person.count.类方法无法获得任何实例变量,智能获得类的引用。可以类比于java的静态方法。

 

小结:主要是讲解一些面向对象的基础。

posted @ 2016-08-04 14:33  ink.liu  阅读(348)  评论(0编辑  收藏  举报