python基础 面向对象编程

面向对象编程的基本思想

  类和实例

    类用于定义抽象类型

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

python 定义类并创建实例

  在python 中,通过class 关键字定义,以Person 为例

  定义一个person 类如下:

    class Person(object):

      pass

python 创建实例属性

   如何让每个实例拥有各自不同的属性。

      xiaoming = Person()

      xiaoming.name = 'Xiao Ming'

      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

python 初始化实例属性

  如何让Person 类在创建的时候就拥有name gender 和 birth 属性。

  在定义Person 类时,可以为Person 类添加一个特殊的 _init_()

  在创建实例时,_init_() 方法被自动调用,我们能再此为每个实例

  都统一加以下属性:

    class Person(object):

      def_init_(self,name,gender,birth):

        self.name = name

        self.gender = gender

        self.birth = birth

      __init__() 方法的第一个参数必须是 self(也可以用别的名字,

      但建议使用习惯用法),后续参数则可以自由指定,和定义函数没有任何区别。

      相应的,创建实例时,就必须提供除self 以外的实例

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

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

      有了__init__()方法,每个Person实例在创建时,都会有 name、gender

       和 birth 这3个属性,并且,被赋予不同的属性值,访问属性使用.操作符:

          print xiaoming.name # 输出 'Xiao Ming'

           print xiaohong.birth # 输出 '1992-2-2'

python 中访问限制

    我们可以给一个实例绑定很多属性,如果有些属性不希望被外

    部访问到怎么办?

    Python对属性权限的控制是通过属性名来实现的,如果一个属

    性由双下划线开头(__),该属性就无法被外部访问。看例子:

      class Person(object):

          def __init__(self,name):

          self.name = name

          self.title = 'Mr'

          self.__job = 'Student'

      p = Person('Bob')

        print p.name

          Bob

        print p._title

          Mr

        print p.__job

          Error

python 创建类属性

    类是模板,而实例则是根据类创建的对象。

    绑定在一个实力上的属性不会影响其他实例,但是类本身是一个对象。

    如果在类上绑定一个属性,则所有实例都可以访问类的属性,并且

    所有实例访问的类属性都是同一个,也就是说,实例属性没个实例

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

    定义类可以直接在class 中定义

      class Person(object):

        address = 'Earth'

        def __init__(self,name):

        self.name = name

    由于python 是动态语言,类属性也可以动态添加修改

      Person.address = 'China'

      print p1.address

        ‘China’

    因为类属性只有一份,所以,当Person类的address改变时,

      所有实例访问到的类属性都改变了。

python 中类属性和实例属性名字冲突怎么办。

    修改类属性会导致所有实例访问到的类属性全部收到影响,但是,

    如果在实例变量上修改类属性发什么问题呢。

    当实例属性和类属性重名时,实例属性优先级高

    它将屏蔽掉对类属性的访问。

python 中定义实例方法

    实例的方法就是在类中定义的函数,它的第一个参数永远

    是self,指定调用该方法的实体本身,其他参数和一个普通

    函数完全一样的。

    class Person(object):

      def __init__(self,name):

      self._name = name

      def get_name(self):

        return self._name

    et_name(self) 就是一个实例方法,它的第一个参数是self

    。__init__(self, name)其实也可看做是一个特殊的实例方法。

    p1 = Person('Bob') print p1.get_name() # self不需要显式传入 # => Bob

python 中方法也是属性

    在class 中定义的实例方法其实也是属性,它实际上

    是一个函数对象。

      class Person(object):

        def __init__(self,name,score):

          self.name = name

          self.score = score

        def get_grade(self):

          return 'A'

python 中定义类方法

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

    在class 中定义的全部是实例方法,实例方法第一个参数 self

    是实例本身。

      在class 中定义类方法,需要这么些。

      class Person(object):

        count = 0;

      @class smethod

      def how_many(cls):

        return cls.count

      def __init__(self,name):

        self.name = name

        Person.count = Person.count + 1

      print Person.how_many()

      p1 = Person('Bob')

      print Person.how_many()

    过标记一个 @classmethod,该方法将绑定到 Person 类上,

    而非类的实例。类方法的第一个参数将传入类本身,通常将

    参数名命名为 cls,上面的 cls.count 实际上相当于 Person.count。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏python学习指南

python正则表达式

本篇将介绍python正则表达式,更多内容请参考:【python正则表达式】 什么是正则表达式 正则表达式,又称规则表达式,通常被用来检索、替换那些符合某...

26260
来自专栏Android开发指南

5:面向对象总结

374120
来自专栏desperate633

LintCode 数组划分题目分析代码

给出一个整数数组 nums 和一个整数 k。划分数组(即移动数组 nums 中的元素),使得:

6410
来自专栏黑泽君的专栏

day03_js学习笔记_02_js的内建对象、js的函数

12530
来自专栏逆向技术

C语言第八讲,指针*

            C语言第八讲,指针* 一丶简单理解指针 说到指针,很多人都说是C语言的重点. 也说是C语言的难点. 其实指针并不是难.而是很多人搞不清地...

38960
来自专栏python读书笔记

python数据分析基础day4-字典字典的定义字典创建字典元素的获取字典的排序

今天说一下重要的数据类型,字典。 字典的定义 python中字典类型就是键值对的集合,其中键在一个字典中必须是唯一的,值没有这个要求。此外,值可以是数值,字符串...

30970
来自专栏转载gongluck的CSDN博客

python笔记:#013#高级变量类型

高级变量类型 目标 列表 元组 字典 字符串 公共方法 变量高级 知识点回顾 Python 中数据类型可以分为 数字型 和 非数字型 数字型 整型 (in...

35590
来自专栏Python小屋

Python获取numpy数组中最大的5个元素(保持原顺序)

本文主要演示numpy的argsort()函数的用法。这个函数的返回值是数组中的元素排序后的原下标,例如np.argsort([3,1,2])的返回结果是arr...

37860
来自专栏云霄雨霁

Java--lambda(λ)表达式

24260
来自专栏java工会

完整的java数组操作应用知识汇总

数组是一种非常有用和常用的数据类型,存在于每种程序语言之中,java中的数组是一种最简单的复合数据类型,刚学习java数组的小白们大多都会听到一句这样的话:ja...

13620

扫码关注云+社区

领取腾讯云代金券