08 面向对象编程

1 介绍

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

把程序看做不同对象的相互调用,对现实世界建立对象模型。

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

类和实例:

类用于定义抽象类型

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

 

 

2 定义类并创建实例

类通过class关键字定义,类名以大写字母开头,紧接着是(object),表示该类是从哪个类继承下来的。

class Person(object):

    pass

xiaoming = Person()    #创建实例

xiaohong = Person()

 

3 创建实例属性

对每一个实例,都可以直接给他们的属性赋值。

例如,给xiaoming这个实例加上name,gender和birth属性:

xiaoming = Person()

xiaoming.name = 'XiaoMing'

xiaoming.gender = 'Male'

xiaoming.birth = '1990-1-1'

 

给xiaohong加上的属性不一定要和xiaoming相同:

xiaohong = Person()

xiaohong.name = 'Xiao Hong'

xiaohong.school = 'No.1 High School'

xiaohong.grade = 2

 

实例属性可以像变量一样进行操作:

xiaohong.grade = xiaohong.grade + 1

 

4 初始化实例属性

Person类在创建的时候就拥有name、gender、birth属性。

在定义Person类时,可以为Person类添加一个特殊的__init__()方法,当创建实例时,这个方法被自动调用。

__init__()方法的第一個参数必須是self(也可以是別的名字,但建议使用习惯用法)。

class Person(object):

    def __init__(self, name, gender, birth):

        self.name = name

        self.gender = gender

        self.birth = birth

xiaoming=Person('Xiao Ming', 'Male', '1991-1-1')

xiaohong=Person('Xiao Hong', 'Female', '1992-2-2')

 

5 访问限制

Python对属性权限的控制是通过属性名来实现的。

如果一个属性由双下划线开头(__),该属性就无法被外部访问。

class Person(object):

    def __init__(self, name):

        self.name = name

        self._title = 'Mr'

        self.__job = 'Student'

>>> p = Person('Bob')

>>> print p.name    #ok

>>> print p._title    #ok

>>> print p.__job    #error

如果一个属性以"__xxx__"的形式定义,那它又可以被外部访问了,以"__xxx__"定义的属性在Python的类中被称爲特殊属性。

由很多预定义的特殊属性可以使用,通常不把普通属性用以"__xxx__"定义。

 

6 创建类属性

相当于java类的静态变量。

class Person(object):

    address = 'Earth'    #类属性

    def __init__(self, name)

        self.name = name

 

可以直接访问类属性,而不必通过类的实例访问。

>>> print Person.address    #Earth

 

类属性也可以动态添加和修改:

Person.address = 'China'

在实例上修改类属性时,实际上并没有修改类属性,而是给实例绑定了一个实例属性。

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

所以千万不要在实例上修改类属性。

 

7 定义实例方法

一个实例的私有属性就是以__开头的属性,无法被外部访问。

实例的方法就是在类中定义的函数,它的第一个参数永远是self,指向调用该方法的实例本身,其他参数和一个普通函数完全一样。

class Person(object):

    def __init__(self, name):

        self.__name = name

    def get_name(self):

        return self.__name

 

在class中定义的实例方法其实也是属性,它实际上是一个函数对象。

 

8 定义类方法

相当于java的静态方法

和属性类似,方法也分实例方法和类方法

通过@classmethod可以将方法绑定到类上,类方法的第一个参数将传入类本身,通常将参数命名为cls。

class Person(object):

    count = 0

    @classmethod

    def how_many(cls):

        return cls.count

    def __inti__(self, name):

        self.name = name

        Person.count = Person.count + 1

 

>>> print Person.how_many()

 

>>> p1 = Person('Bob')

>>> print Person.how_many()

 

因为是在类上调用,而非实例上调用,因此类方法无法获得任何实例变量,只能获得类的引用。

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值