Python OOP(1):从基础开始
本文旨在Python复习和总结:
1、如何创建类和实例?

# 创建类
class ClassName(object):
"""docstring for ClassName"""
def __init__(self, arg):
super(ClassName, self).__init__()
self.arg = arg
# 创建实例
instance = ClassName()
2、经典类与新式类的区别?
3、什么是方法?如何定义?如何使用?
方法是类的功能
定义在类中
通过实例调用
4、self代表什么?用在哪些地方?
每个类方法都有一个self参数,代表实例对象本身,当实例调用方法时,由解释器悄悄地传递给方法,不用手动self进来。
self在Python里不是关键字。self代表当前对象的地址。self能避免非限定调用造成的全局变量。
在wangkangluo1的Python为什么要self中讲的很清楚:
创建了一个类MyClass,实例化MyClass得到了MyObject这个对象,然后调用这个对象的方法MyObject.method(arg1,arg2) ,这个过程中,Python会自动转为Myclass.mehod(MyObject,arg1,arg2)
这就是Python的self的原理了。即使你的类的方法不需要任何参数,但还是得给这个方法定义一个self参数。
5、类对象的两种操作?
定义完类之后就产生了类对象,类对象支持的两种操作:引用和实例
。引用:通过类对象去调用类中的属性或方法;实例:通过类对象实例化一个类对象的实体。
6、什么是Python类属性和实例属性?
属性就是另一个对象的数据或函数元素!通过句点符号访问,如一些python类型如复数有数据属性,列表和字典拥有方法(函数属性)。还有可能是,访问一个属性时,这个属性又是对象,其又拥有自己的属性,这样就构成了属性链。如:
>>> import sys
>>> sys.stdout.write('beginman')
beginman
>>> myMoudel.myClass.__doc__
类属性与类相关,与实例无关,通常是类的数据属性,仅仅是类中定义的变量,通常称作静态变量或静态数据。在其他语言中相当于在变量前加上
static。
>>> class C(object):
foo = 100 # 定义类属性
>>> print C.foo # 访问类属性
100
>>> C.foo = C.foo+100 # 更新类属性
>>> C.foo
200
由上所知,类属性仅仅与类(类也是对象,python中称类对象)相关,与实例半毛钱关系都没有。
>>> class C(object):
foo = 100 # 定义类属性
>>> print C.foo # 访问类属性
100
>>> C.foo = C.foo+100 # 更新类属性
>>> C.foo
200
>>> c=C() # 实例化一个对象c
>>> c.foo
200
>>> c.foo = 1000 # 实例试图修改类属性
>>> c.foo # 实例想看是否修改成功,于是就c.foo竟输出1000,于是实例就满以为自己成功了
1000
>>> C.foo # 类对象鄙夷的看了实例一样,说:“你就是老子生出来的,老子的东西你也能碰??”
200
>>> del c.foo # 实例看完之后当场傻眼,心想mlgb,你牛B,我还是除掉自己负担沉重的改造吧
>>> c.foo # 实例除掉了自己负担沉重的改造后,老老实实地调用类对象给的sb玩意
200
>>> # 通过类对象与实例关于类属性争权大战后,我们知道了一点:
>>> #类属性仅仅与类(类也是对象,python中称类对象)相关,与实例半毛钱关系都没有。
>>> #如果类的实例没有同名变量也可以使用实例来访问。如果实例含有与类属性同名的属性,则用该实例访问属性时,访问的是实例中的属性。如果类的实例没有同名变量也可以使用实例来访问。如果实例含有与类属性同名的属性,则用该实例访问属性时,访问的是实例中的属性。
>>>
7、类方法?
>>> class C(object):
foo = 100
def met(self):
print 'i am method for class.'
>>> C.met() # C心想方法也是我的一部分,那么方法也是类属性*(这点很正确),于是我调用你玩玩
Traceback (most recent call last):
File "<pyshell#31>", line 1, in <module>
C.met() # C心想方法也是我的一部分,那么方法也是类属性*(这点很正确),于是我调用你玩玩
TypeError: unbound method met() must be called with C instance as first argument (got nothing instead)
>>> # 出大事了,方法竟然不同意还反抗了
>>> # 心想这是为什么呢?突然想到了原来是那鸟人Python
>>> # 鸟人 Guido van Rossum 创造Python类给出的规定就是,你可以创类方法,但是不能调戏她。
>>> c=C() # 类心有不甘,于是创了实例小c来助纣为虐
>>> c.met() # 实例小c心想,mlgbd,上次想修改类属性就被你狠狠地鄙视了一番,现在又为难我,唉,命苦。无论如何试试吧
i am method for class.
>>> # 龌龊,类方法竟然听我实例的,于是实例就赶紧找Guido van Rossum问什么情况
>>> # Guido van Rossum就说”为了与OOP惯例保持一致,没有实例就不能调用方法,这种限制就是Python所描述的绑定概念,方法必须绑定在实例中才听话,不能把权利都交给了类,这是老子对你实例的恩惠啊。“
>>> # 实例听完泪牛满面,类对象发怒了,说:”今天,我就要把我身上的所有零件(属性)都掏出来看看,看都有谁不听话!“
>>> dir(C) # 于是类对象使用第一招 dir()内建
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'foo', 'met']
>>> print C.__dict__ # 第二招就是召遣他最听话的属性 __dict__ 来揪出
{'__module__': '__main__', 'met': <function met at 0x0000000002D33EB8>, '__dict__': <attribute '__dict__' of 'C' objects>, 'foo': 100, '__weakref__': <attribute '__weakref__' of 'C' objects>, '__doc__': None}
>>>
类对象出尽风头之后,该轮到实例了:
实例的创建:
C++等编程应用,实例对象是New出来的,Python牛b,就跟人家不一样,偏以函数调用的形式实例化。
class CC(object):
#我是Python类默许的,没重写__init__,所以也没有什么特殊操作
pass
class C(object):
def __init__(self,name,phone,ID):
super(C,self).__init__()
self.name = name
self.phone = phone
self.id = ID
print 'Hi man 我重写了__init__,因为我需要更多的操作'
cc = CC() # 创建CC实例
c = C('BeginMan','110','12306') # 创建C实例
重点::
当类被调用,实例化的第一步就是创建实例对象,然后Python检查是否实现了__init__()方法,默认情况下如果没有覆盖__init__就不会施加特别的操作。任何特别的操作都需要重写__init__。
接着就是传递参数,这依赖于你自己定义的__init__,它里面有多少个参数,在实例化的过程中就要传多少个参数,不管是否覆盖了__init__(),实例对象都要作为第一个参数传递进去。
__init__与__new__,__call__的区别:
__new__更像真正的构造器,创建对象时调用,返回当前对象的一个实例。但是实际中用的很少。
__init__:初始化工作,创建对象时调用,对当前对象的实例进行初始化,无返回值。在Python中很常用的。
__call__:让类的实例的行为表现的像函数一样,你可以调用他们,将一个函数当做一个参数传到另外一个函数中等等。很少用。
优先级:__new__先与__init__
__del__析构器方法,见《py 核心》
实例属性:
可在创建实例后的任意时间创建,也可以在"运行时"创建.__init__()是创建这些属性的关键点。
>>> c.__dict__ # 此时实例c还没属性
{}
>>> c.__class__ # 实例化的类
<class '__main__.C'>
>>> c.foo=1
>>> c.name='CS'
>>> c.__dict__
{'foo': 1, 'name': 'CS'}
>>> dir(c)
[***'foo', 'name'***,'__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']
python面向对象与其他语言的异同点?
大同小异
Differences between “Java OOP” and “Pythonic OOP”?
真tm的拗口,谁英文好能翻译下。
什么是构造器,__init__表示什么? 有什么意义?
OOP常用术语
这在软件工程经常见到的,由于Python OOP实际运用的并不是太多,所以对于OOP特征的体现就不那么明显,C++/Java/C# OOP思想体现倒是挺深的,不过本人太菜,难以熟谙OOP的精髓。
面向对象程序设计中的常用术语总结
其中对还包括自省。
什么是Python自省(反射)?
下期:Python OOP高级。
Python OOP(1):从基础开始的更多相关文章
- <转>Python OOP(1):从基础开始
转自 http://www.cnblogs.com/BeginMan/p/3510786.html 本文旨在Python复习和总结: 1.如何创建类和实例? # 创建类 class ClassNam ...
- 8.python笔记之面向对象基础
title: 8.Python笔记之面向对象基础 date: 2016-02-21 15:10:35 tags: Python categories: Python --- 面向对象思维导图 (来自1 ...
- Python运维开发基础-概述-简介
Python基础知识分为以下几块 1.Python概述 2.基础语法 3.数据结构 4.Python进阶 5.实训案例 一.Python概述 1.Python简介 2.Hello World 3.搭建 ...
- python 小白(无编程基础,无计算机基础)的开发之路 day1
本节内容 Python介绍 发展史 Python 2 or 3? 安装 Hello World程序 变量 用户输入 模块初识 .pyc是个什么鬼? 数据类型初识 数据运算 表达式if ...else语 ...
- python 3.x 爬虫基础---Urllib详解
python 3.x 爬虫基础 python 3.x 爬虫基础---http headers详解 python 3.x 爬虫基础---Urllib详解 前言 爬虫也了解了一段时间了希望在半个月的时间内 ...
- python 3.x 爬虫基础---常用第三方库(requests,BeautifulSoup4,selenium,lxml )
python 3.x 爬虫基础 python 3.x 爬虫基础---http headers详解 python 3.x 爬虫基础---Urllib详解 python 3.x 爬虫基础---常用第三方库 ...
- 利用Python进行数据分析——Numpy基础:数组和矢量计算
利用Python进行数据分析--Numpy基础:数组和矢量计算 ndarry,一个具有矢量运算和复杂广播能力快速节省空间的多维数组 对整组数据进行快速运算的标准数学函数,无需for-loop 用于读写 ...
- Python股票分析系列——基础股票数据操作(一).p3
该系列视频已经搬运至bilibili: 点击查看 欢迎来到Python for Finance教程系列的第3部分.在本教程中,我们将使用我们的股票数据进一步分解一些基本的数据操作和可视化.我们将要使用 ...
- python学习日记(基础数据类型及其方法01)
数字 int 主要是用于计算的,常用的方法有一种 #既十进制数值用二进制表示时,最少使用的位数i = 3#3的ASCII为:0000 0011,即两位 s = i.bit_length() print ...
随机推荐
- LINUX系统下添加映射存储LUN
LINUX系统下添加映射存储LUN(无需重启) 背景:Oracle rac环境 添加新实例,重新划分存储空间,从存储映射新的LUN. 问题:映射后,linux操作系统无法识别新的LUN,不能重启系统, ...
- Android SDK在线更新镜像服务器大全
http://www.androiddevtools.cn/ 原文:http://www.jb51.net/article/73732.htm 由于一些原因,Google相关很多服务都无法访问,所以在 ...
- Python: 收集所有命名参数
有时候把Python函数调用的命名参数都收集到一个dict中可以更方便地做参数检查,或者直接由参数创建attribute等.更简单的理解就是def foo(*args, **kwargs): pass ...
- node-webkit 笔记
NW.js is an app runtime based on Chromium and node.js. You can write native apps in HTML and JavaScr ...
- 并行编程多线程之Parallel
1.简介 随着多核时代的到来,并行开发越来越展示出它的强大威力!使用并行程序,充分的利用系统资源,提高程序的性能.在.net 4.0中,微软给我们提供了一个新的命名空间:System.Threadin ...
- Python--Cmd窗口运行Python时提示Fatal Python error: Py_Initialize: can't initialize sys standard streams LookupError: unknown encoding: cp65001
源地址连接: http://www.tuicool.com/articles/ryuaUze 最近,我在把一个 Python 2 的视频下载工具 youku-lixian 改写成 Python 3,并 ...
- 配置jenkins,并把iOS包自动上传至fir.im
安装jenkins,有两种方式 1.首先要安装 homebrew,利用homebrew来管理安装包十分方便,一条命令就可以 安装 homebrew命令 $ ruby -e "$(curl - ...
- 一起做RGB-D SLAM 第二季 (二)
本节目标 我们要实现一个基本的文件IO,用于读取TUM数据集中的图像.顺带的,还要做一个参数文件的读取. 设计参数文件读取的类:ParameterReader 首先,我们来做一个参数读取的类.该类读取 ...
- [转]Android dex分包方案
转载自:https://m.oschina.net/blog/308583 当一个app的功能越来越复杂,代码量越来越多,也许有一天便会突然遇到下列现象: 1. 生成的apk在2.3以前的机器无法安装 ...
- java攻城狮之路(Android篇)--Activity生命
一:Activity的激活 1.写一个类 extends Activity Activity是android的四大组件之一.Activity的激活分为显式意图激活和隐式意图激活.如果一个activit ...