chapter 13面向对象-再次阅读

1.复习一下dir()和__dict__.

>>> class C(object):

pass

>>> c=C()

>>> dir(C)

[‘__class__‘, ‘__delattr__‘, ‘__dict__‘, ‘__doc__‘, ‘__format__‘, ‘__getattribute__‘, ‘__hash__‘, ‘__init__‘, ‘__module__‘,

‘__new__‘, ‘__reduce__‘, ‘__reduce_ex__‘, ‘__repr__‘, ‘__setattr__‘, ‘__sizeof__‘, ‘__str__‘, ‘__subclasshook__‘, ‘__weakref__‘]

>>> dir(c)

[‘__class__‘, ‘__delattr__‘, ‘__dict__‘, ‘__doc__‘, ‘__format__‘, ‘__getattribute__‘, ‘__hash__‘, ‘__init__‘, ‘__module__‘,

‘__new__‘, ‘__reduce__‘, ‘__reduce_ex__‘, ‘__repr__‘, ‘__setattr__‘, ‘__sizeof__‘, ‘__str__‘, ‘__subclasshook__‘, ‘__weakref__‘]

>>> c.__dict__

{}

>>> c.bar=‘rao‘

>>> dir(c)

[‘__class__‘, ‘__delattr__‘, ‘__dict__‘, ‘__doc__‘, ‘__format__‘, ‘__getattribute__‘, ‘__hash__‘, ‘__init__‘, ‘__module__‘,

‘__new__‘, ‘__reduce__‘, ‘__reduce_ex__‘, ‘__repr__‘, ‘__setattr__‘, ‘__sizeof__‘, ‘__str__‘, ‘__subclasshook__‘, ‘__weakref__‘,

‘bar‘]

>>> dir(C)

[‘__class__‘, ‘__delattr__‘, ‘__dict__‘, ‘__doc__‘, ‘__format__‘, ‘__getattribute__‘, ‘__hash__‘, ‘__init__‘, ‘__module__‘,

‘__new__‘, ‘__reduce__‘, ‘__reduce_ex__‘, ‘__repr__‘, ‘__setattr__‘, ‘__sizeof__‘, ‘__str__‘, ‘__subclasshook__‘, ‘__weakref__‘]

>>> c.__dict__

{‘bar‘: ‘rao‘}

可以看出实例的dir(c)包括类的dir(C)加上实例自己的数据属性。

而实例的__dict__则仅仅是他的数据属性,(实例也没有方法属性)

内建类型中可以用dir(),不可以用__dict__

2.

实例仅有两个特殊属性(见表13.2)。对于任意对象I:

表13.2 特殊实例属性

I.__class__ 实例化I 的类

I.__dict__ I 的属性

从标准类型派生(标准类型分两种:可变类型,不可变类型)

可变类型(list的值改变了但是id没有变化,id(list)一直不变化):list,dict

不可变类型:string,int,tuple

class RoundFloat(float):

def __new__(cls, val):

return float.__new__(cls, round(val, 2))

#return super(RoundFloat,cls).__new__(cls,round(val,2))

tips:所有的__new()__方法都是类方法,我们要显式传入类作为第一个参数(cls),这类似于常见的方法如__init__()中需要的self

类、实例和其他对象的内建函数:

issubclass(sub,sup)

isinstance(obj1,obj2)

hasattr(), getattr(),setattr(), delattr()有两个参数,第一个是正在处理的对象,第二个就是属性名,是属性的字符串名字

对于每个定义的类都有一个名为__mro__的属性,她是一个元组,按照他们被搜索时的顺序,列出了被搜索的类。super()是用来解决多重继承的问

题的,而且只能作用于新式类上。super()用来调用父类非绑定的方法

vars()

vars()内建函数与dir()相似,只是给定的对象参数都必须有一个__dict__属性。vars()返回一

个字典,它包含了对象存储于其__dict__中的属性(键)及值。如果提供的对象没有这样一个属性,

则会引发一个TypeError 异常。如果没有提供对象作为vars()的一个参数,它将显示一个包含本地

名字空间的属性(键)及其值的字典,也就是,locals()。我们来看一下例子,使用类实例调用vars():

用特殊方法定制类:

class Time60(object):

def __init__(self,hr,min):

self.hr=hr

self.min=min

def __str__(self):

return ‘%d:%d‘%(self.hr,self.min)

__repr__=__str__

def __add__(self,other):

hour=self.hr+other.hr

mins=self.min+other.min

if mins>60:

return self.__class__(hour+1,mins-60)

else:

return self.__class__(hour,mins)

def __sub__(self,other):

return self.__class__(abs(self.hr-other.hr),abs(self.min-other.min))

mon=Time60(10,30)

tue=Time60(11,55)

print mon-tue

随机序列迭代器:

要想自定义的类的实例可以迭代必须加载iter方法

def __iter__(self):

return self

from random import choice

class RandSeq(object):

def __init__(self,seq):

self.data=seq

def __iter__(self):

return self

def next(self):

return choice(self.data)

def __str__(self):

return  str(self.data)

rand=RandSeq([1,2,3,4,5])

for eachItem in rand:

print eachItem

class AnyIter(object):

def __init__(self,data,safe=False):

self.safe=safe

self.iter=iter(data)

def __iter__(self):

return self

def next(self,howmany):

retval=[]

for eachItem in range(howmany):

try:

retval.append(self.iter.next())

except StopIteration:

if self.safe:

break

else:

raise

return retval

a=AnyIter(range(10))

i=iter(a)

for j in range(1,5):

print j,‘:‘,a.next(j)

question:这个例子中我不明白为什么要设置i=iter(a),然后调用print j,‘:‘,i.next(j),我发现直接调用我写的 print j,‘:‘,a.next(j)

也是生成同样的结果哎。。。

*多类型定制(NumStr)

class NumStr(object):

def __init__(self,num=0,str=‘‘):

self.num=num

self.str=str

def __str__(self):

return "[%d::%r]"%(self.num,self.str)

__repr__ = __str__

def __add__(self,other):

return self.__class__(self.num+other.num,self.str+other.str)

def __mul__(self,num):

if isinstance(num,int):

return self.__class__(self.num*num,self.str*num)

else:

raise TypeError,‘Illegal argument type for built-in operation‘

def __nonzero__(self):

return self.num or len(self.str)

def __norm_cval(self,cmpres):

return cmp(cmpres,0)

def __cmp__(self,other):

return self.__norm_cval(cmp(self.num,other.num))+self.__norm_cval(cmp(self.str,other.str))

a=NumStr(2,‘rao‘)

b=NumStr(3,‘yuan‘)

print a>b

包装的定义:

时间: 2024-08-06 07:07:39

chapter 13面向对象-再次阅读的相关文章

面向对象葵花宝典阅读思维导图(二)

在CSDN看到一个博主的一个系列不错,叫的是<面向对象葵花宝典>,看的话必须自宫么- -,学到了很多,但是怎么记录呢?单纯的文字没有一个树形结构的概念,看起来也不清晰,我就自己花了一个思维导图记录一下~ 专栏的地址是http://blog.csdn.net/column/details/oobaodian.html 本节记录的是该系列的14-17节 需求理解 即系统需要做什么 需求不等于功能  例子:ATM机 "取款"."存款"."查询余额&q

《linux 内核完全剖析》chapter 13 内存管理 (不含swap.c)

内存管理(memory.c 和swap.s 部分) "倒着看" 先看memory management,很明显,前面各种阻力,都是因为涉及内存管理.不先看这个,我估计前面看了也是白看 我估算着理论打基础砸了差不多一个星期的时间在memory management上面了...感觉很有收获,是时候用实践(code)印证理论了! <modern operating system>讲内存管理那一章 http://blog.csdn.net/cinmyheart/article/de

零元学Expression Blend 4 - Chapter 13 用实例了解布局容器系列-「Pathlistbox」I

原文:零元学Expression Blend 4 - Chapter 13 用实例了解布局容器系列-「Pathlistbox」I 本系列将教大家以实做案例认识Blend 4 的布局容器,此章介绍的布局容器是Blend 4 里的-「Pathlistbox」 ? 本系列将教大家以实做案例认识Blend 4 的布局容器,此章介绍的布局容器是Blend 4 里的-「Pathlistbox」 ? 就是要让不会的新手都看的懂! ? <先来了解Pathlistbox的基本功能> 01 开启一个新专案後,在主

13.面向对象编程

1.前言 前面一直是语法与面向过程编程,这张我们来学oop 2.直接开搞,python中如何创建一个类? 答: 用到关键字 class, 类名是MyFirst 括号的是 扩展的基类object class MyFirst(object): 'my first class' #类也有文档字符串哦 foo = 100 3.静态变量(名字翻译好多:静态属性.类变量.静态数据) class MyFirst(object): 'my first class' #类也有文档字符串哦 foo = 100 pr

13 面向对象编程 - 《Python 核心编程》

?? 引言 ?? 面向对象编程 ?? 类 ?? 实例 ?? 绑定与方法调用 ?? 子类,派生和继承 ?? 内建函数 ?? 定制类 ?? 私有性 ?? 授权与包装 ?? 新式类的高级特性 ?? 相关模块 13.1 介绍 在Python 中,面向对象编程主要有两个主题,就是类和类实例 类与实例 如何创建一个类: class MyNewObjectType(bases): 'define MyNewObjectType class' class_suite #类体 关键字是class,紧接着是一个类名

Cpp Chapter 13: Class Inheritance Part1

class inheritance lets you derive new classes from old ones, inheriting its properties of the old class, called the base class With inheritance, you can: 1 add functionality to existing classes 2 add the data a class represents 3 modify how a class m

13.面向对象与继承

面向对象与原型 学习要点:1.学习条件2.创建对象3.原型4.继承 ECMAScript有两种开发模式:1.函数式(过程化) 2.面向对象(OOP).面向对象的语言有一个标志,那就是类的概念,而通过类可以创建任意多个具有相同属性和方法的对象.但是ECMASxript没有类的概念,因此它的对象也与基于类的语言中的对象有所不同. 一.学习条件 在JavaScript视频课程第一节课,就已经声明,Javascript课程需要大量的基础.这里我们详细探讨一下: 1.xhtml基础:Javascript方

Chapter 1. 面向对象(类、对象、字段、方法、属性、构造函数)

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 面向对象 { //创建person类 public class person { //Fields:字段 private string _name; private int _age; private char _gender; //Properties:属性 public string Name { ge

Chapter 6 面向对象基础

面向对象=对象+类+继承+通信,如果一个软件系统采用这些概念来建立模型并给予实现,那么它就是面向对象的.面向对象的软件工程方法是面向对象方法在软件工程领域的全面运用涉及到从面向对象分析.面向对象设计.面向对象编程.面相对象测试到面向对象软件维护的全过程.对象是系统中用来描述客观事物的一个实体,是构成系统的一个基本单位.类是具有相同属性和服务的一组对象的集合,它为属于该类的全部对象提供了统一的抽象描述.封装是把对象的属性和服务结合成一个独立的系统单位,并尽可能的隐藏对象的内部细节.继承是指子类可以