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

什么是面向对象的编程?

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

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

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

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

1.类用于定义抽象类型

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

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

  1. >>> class Animal(object):
  2. pass
  3.  
  4. >>> dog = Animal()
  5. >>> cat = Animal()

何为实例属性

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

  1. >>> class Animal(object):
  2. pass
  3.  
  4. >>> dog = Animal()
  5. >>> dog.name = 'wangcai'
  6. >>> cat = Animal()
  7. >>> cat.name = 'beibei'

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

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

  1. >>> class Animal(object):
  2. def __init__(self,name):
  3. self.name = name
  4.  
  5. >>> dog = Animal('wangcai')
  6. >>> print dog.name
  7. wangcai

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

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

访问限制

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

  1. >>> class Animal(object):
  2. def __init__(self,name,birth):
  3. self.name = name
  4. self.__birth = birth
  5.  
  6. >>> dog = Animal('wangcai','2016-08-04')
  7. >>> print dog.name
  8. wangcai
  9. >>> print dog.__birth
  10.  
  11. Traceback (most recent call last):
  12. File "<pyshell#100>", line 1, in <module>
  13. print dog.__birth
  14. AttributeError: 'Animal' object has no attribute '__birth'

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

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

类属性

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

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

  1. >>> class Person(object):
  2. address = 'west'
  3. def __init__(self,name):
  4. self.name =name
  5.  
  6. >>> print Person.address
  7. west
  8. >>> p1 = Person('liunx')
  9. >>> print p1.address
  10. west

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

  1. >>> Person.address = 'earth'
  2. >>> p1.address
  3. 'earth'

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

  1. >>> class Person(object):
  2. address = 'west'
  3. def __init__(self,name):
  4. self.name =name
  5.  
  6. >>> p1 = Person('liunx')
  7. >>> p1.address = 'earth'//实例属性address
  8. >>> print Person.address
  9. west
  10. >>> Person.address = 'west_1' //修改类属性
  11. >>> print p1.address //实例属性不变,还是earch
  12. earth

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

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

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

定义实例方法

  1. >>> class Animal(object):
  2. def __init__(self,name):
  3. self.__name = name
  4. def get_name(self):
  5. return self.__name
  6.  
  7. >>> dog = Animal('wangcai')
  8.  
  9. >>> print dog.get_name()
  10. wangcai

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

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

定义类方法

  1. >>> class Person(object):
  2. count = 0
  3. @classmethod
  4. def how_many(cls):
  5. return cls.count
  6. def __init__(self, name):
  7. self.name = name
  8. Person.count = Person.count + 1
  9.  
  10. >>> print Person.how_many()
  11. 0
  12. >>> p1 = Person('liunx')
  13. >>> print Person.how_many()
  14. 1

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

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

python学习第十四天 -面向对象编程基础的更多相关文章

  1. python学习笔记(四)——面向对象编程

    python 支持面向过程编程和面向对象编程. 传统面向过程编程,也叫函数式编程,通过我们的需求设计成一个一个的函数来完成,对一些小规模程序来说面向过程确实简单方便不少.而随着互联网的发展,对于一些大 ...

  2. Python学习(十四) —— 并发编程

    一.进程的概念 进程即正在执行的一个过程,进程是对正在运行的程序的一个抽象. 进程的概念起源于操作系统,是操作系统最核心的概念.操作系统的其它所有内容都是围绕进程的概念展开的. #必备的理论基础 #一 ...

  3. python学习(十四)面向对象

    Python中的面向对象,先写类,会生成类对象,类对象然后创建对象,对象就可以拿来用了. Python支持多重继承. class语句创建类对象,并将其赋值给变量名. class语句内的赋值语句会创建类 ...

  4. Python学习第十四课——面向对象基本思想part1

    面向对象的基本思想 # 写法1 person1 = { 'name': 'hanhan', ', 'sex': '男' } def xue_xi(person): print('%s在学习' % pe ...

  5. python学习(十四) 网络编程

    14.1 少数几个网络设计模块 14.1.1 socket模块 套接字包括:服务器套接字和客户机套接字. 在创建一个服务器套架字后,让它等待连接,这样它就在摸个网络地址处(IP地址和一个端口号的组合) ...

  6. python学习之路 八 :面向对象编程基础

    本节重点 了解面向对象.面向过程的区别 掌握什么是类,什么是对象 掌握如何定义及使用类和对象 了解类与对象间的关系 掌握类属性和实例属性 掌握绑定方法 一.编程范式 ​    ​编程即写程序or写代码 ...

  7. Python学习笔记(四)函数式编程

    高阶函数(Higher-order function) Input: 1 abs Output: 1 <function abs> Input: 1 abs(-10) Output: 1 ...

  8. Python学习(十二) —— 面向对象

    一.初识面向对象 面向过程的核心是过程,流水线思维,过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. 优点:极大地降低了写程序的复杂度,只需要顺着要执行的 ...

  9. Python学习第十四篇——类初步使用及面向对象思想

    class Restaurant(): def __init__(self,restaurant_name,cuisine_type): self.name = restaurant_name sel ...

随机推荐

  1. TCP 的那些事儿(转载)

    无论是PC客户端开发还是移动开发,或是Web开发, 网络编程都是很重要的一块, 深入理解TCP/IP和HTTP协议是一个优秀程序员的必备技能.看到酷壳老大正好写了篇相关文章, 正好拿来学习, 转自 h ...

  2. Delphi IDHTTP用法详解(六种用法)

    一.IDHTTP的基本用法 IDHttp和WebBrowser一样,都可以实现抓取远端网页的功能,但是http方式更快.更节约资源,缺点是需要手动维护cook,连接等 IDHttp的创建,需要引入ID ...

  3. c# 实现文件拖入和拖出(拖拽)

    摘自:http://www.cnblogs.com/eaglet/archive/2009/01/06/1370149.html C# WinForm下一步一步实现文件的拖入和拖出 作者:Eaglet ...

  4. HDU 5505 - BestCoder Round #60 - GT and numbers

    题目链接 : http://bestcoder.hdu.edu.cn/contests/contest_chineseproblem.php?cid=641&pid=1002 思路 : N有若 ...

  5. [饭后算法系列] "头尾移动" 排序列表

    1. 问题 一个乱序列表(list), 只支持两种操作: 把一个元素移动到头部, 或者把一个元素移动到尾部. 需要设计一种算法, 使得移动次数最少而使列表有序 举两个例子: 1. {3,5,7,1,9 ...

  6. nginx本地的测试环境添加SSL

    要在本地添加SSL,首先要做的是防火墙是不是放开了443端口,同时,在nginx安装时是不是支持了ssl模块,这个安装网上很容易找到相关资料 防火墙,个人还是用iptables比较直观 先将selin ...

  7. SQL Server error "Xml data type is not supported in distributed queries" and workaround for it

    Recently while working with data migration,got an error while running a following query where Server ...

  8. Javascript:sort()方法快速实现对数组排序

    定义和用法: sort() 方法用于对数组的元素进行排序. 语法: arrayObject.sort(sortby) 注释:sortby,可选,规定排序顺序,必须是函数. 说明: 如果调用该方法时没有 ...

  9. easyui 获取cloumns字段

    var colums=datagrid.datagrid('options').columns; var frozens=datagrid.datagrid('options').frozenColu ...

  10. IE6下的怪异解析知识点补充

    转载请注明出处:HTMl5自由者