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的静态方法。

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

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. iOS开发工具——统计Crash的工具Crashlytics-备用

    简介 Crashlytic 成立于2011年,是专门为移动应用开者发提供的保存和分析应用崩溃信息的工具.Crashlytics的使用者包括:支付工具Paypal, 点评应用Yelp, 照片分享应用Pa ...

  2. zoj 3647 Gao the Grid

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4837 先求出从所有点随机找出三个点的组合数,然后去掉共线的,平行好去掉,斜线就 ...

  3. QT:不规则窗口的实现

    主要思路:1:将窗体设为Qt::FramelessWindowHint(去掉标题栏).2:用一幅有部分区域是透明的图片作为程序的界面,并将图片透明的地方设为穿透. 3:重载程序的鼠标事件. 运行时截图 ...

  4. Android中如何利用attrs和styles定义控件

    一直有个问题就是,Android中是如何通过布局文件,就能实现控件效果的不同呢?比如在布局文件中,我设置了一个TextView,给它设置了 textColor,它就能够改变这个TextView的文本的 ...

  5. 基于SQL_ID查看对象大小

    SQL> set echo off set echo off set verify off set serveroutput on set feedback off set lines 200 ...

  6. Python模拟登录实战(一)

    今天,学习了模拟登录新浪微博.模拟登录主要有两种方式,一.利用Cookie:二.模仿浏览器的请求,发送表单. 法一: Cookie:指某些网站为了辨别用户身份而储存在用户本地终端上的数据(通常经过加密 ...

  7. 正则表达式:网页爬虫:从TXT中获取邮箱地址(获取的练习,缺点:一行只能匹配一个)

    import java.util.regex.*; import java.io.*; class L { public static void main(String[] args) throws  ...

  8. onActivityResult不执行 或者 onActivityResult的解决方法

    开发人员都知道,可以通过使用 startActivityForResult() 和 onActivityResult() 方法来传递或接收参数.然而在一次使用中,还没等到被调用的 Activity 返 ...

  9. [OGRE]看备注学编程(02):打地鼠01-布置场地九只地鼠

    项目下载地址:http://download.csdn.net/detail/wxg694175346/6340347 头文件ShrewMouseApplication.h: #ifndef __Sh ...

  10. Android的深度定制版阿里云os(Android的山寨)

    阿里云OS(YunOS)是阿里巴巴集团的智能手机操作系统,依托于阿里巴巴集团电子商务领域积累的经验和强大的云计算平台,基于LINUX开发. 魅族4阿里yun OS版已上市.[1] 1简介 阿 里云OS ...