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的静态方法。
小结:主要是讲解一些面向对象的基础。