python 魔法方法,属性,迭代

9.2 构造方法

python 中也属于自己的构造函数和析构函数,

class fibs:
	def __init__(self):
		self.a = 0
		self.b = 1
	def next(self):
		self.a,self.b = self.b,self.a+self.b
		return self.a
	def __iter__(self):
		return self

fib = fibs()
for i in fib:
    if i>1000:
        print i
        break

其中的__init__ 就是在类创建对象的时候自动调用的,而下面两个函数就是在迭代的时候自动调用的,这是python实现的语法。

类在继承时不显示调用父类的构造方法时,父类构造方法中声明的元素不会被继承

class Bird:
    def __init__(self):
        self.hungry = True
    def eat(self):
        if self.hungry:
            print ‘Ohhh.haha!‘
            self.hungry = False
        else:
            print ‘I\‘m full Thanks!‘
class SongBird(Bird):
    def __init__(self):
        self.sound = ‘Squawk!‘
    def sing(self):
        print self.sound

b = Bird()
b.eat()
b.eat()
sb = SongBird()
sb.sing()
sb.eat()

>>>

Ohhh.haha!

I‘m full Thanks!

Squawk!

Traceback (most recent call last):

File "G:\New Knowledge\practice\python\test.py", line 21, in <module>

sb.eat()

File "G:\New Knowledge\practice\python\test.py", line 5, in eat

if self.hungry:

AttributeError: SongBird instance has no attribute ‘hungry‘

>>>

class Bird:
    def __init__(self):
        self.hungry = True
    def eat(self):
        if self.hungry:
            print ‘Ohhh.haha!‘
            self.hungry = False
        else:
            print ‘I\‘m full Thanks!‘
class SongBird(Bird):
    def __init__(self):
        self.sound = ‘Squawk!‘
        Bird.__init__(self)
    def sing(self):
        print self.sound

b = Bird()
b.eat()
b.eat()
sb = SongBird()
sb.sing()
sb.eat()

>>>

Ohhh.haha!

I‘m full Thanks!

Squawk!

Ohhh.haha!

>>>

# -*- coding: cp936 -*-
class Bird:
    def __init__(self):
        self.hungry = True
    def eat(self):
        if self.hungry:
            print ‘Ohhh.haha!‘
            self.hungry = False
        else:
            print ‘I\‘m full Thanks!‘
    @classmethod
    def say(self):
        print ‘Hello ,everybody!‘
    #类中的方法都至少带个self参数
    #这样声明的函数只用类对象才能调用
    #只有@classmethod 或@staticmethod 可用类名调用,而不需要生成实例对象
class SongBird(Bird):
    def __init__(self):
        self.sound = ‘Squawk!‘
        Bird.__init__(self)
    def sing(self):
        print self.sound

b = Bird()
b.eat()
b.eat()
b.say()
Bird.say()
sb = SongBird()
sb.sing()
sb.eat()

>>>

Ohhh.haha!

I‘m full Thanks!

Hello ,everybody!

Hello ,everybody!

Squawk!

Ohhh.haha!

>>>

9.7递归生成器

# -*- coding: cp936 -*-
def flatten(nested):
    try:
        for sublist in nested:
            for element in flatten(sublist):
                yield element
    except TypeError:
        yield nested
def flatten_new(nested):
    try:
        try:nested + ‘‘#列表不能加字符
        except:pass
        else:raise TypeError
        for sublist in nested:
            for element in flatten_new(sublist):
                yield element
    except TypeError:
        yield nested
test = [[[1],2],[3],[4,[5,[6,[7]]],8]]
test_char = [‘foo‘,[‘bar‘,[‘join‘]],‘tu‘]
print "old\n:",list(flatten(test))
print "new\n:",list(flatten_new(test))
print "new\n:",list(flatten_new(test_char))
print "old\n:",list(flatten(test_char))#死循环

old

: [1, 2, 3, 4, 5, 6, 7, 8]

new

: [1, 2, 3, 4, 5, 6, 7, 8]

new

: [‘foo‘, ‘bar‘, ‘join‘, ‘tu‘]

old

:

Traceback (most recent call last):

File "G:/New Knowledge/practice/python/yield_test.py", line 24, in <module>

print "old\n:",list(flatten(test_char))

File "G:/New Knowledge/practice/python/yield_test.py", line 5, in flatten

for element in flatten(sublist):

File "G:/New Knowledge/practice/python/yield_test.py", line 5, in flatten

for element in flatten(sublist):

>>> def repeater(value):
	while True:
		new = (yield value)
		if new is not None:value = new

>>> r = repeater(43)
>>> r.next()
43
>>> r.next()
43
>>> r.send("hello!")
‘hello!‘
>>> r.next()
‘hello!‘
>>> 

python 魔法方法,属性,迭代

时间: 2024-10-17 23:46:47

python 魔法方法,属性,迭代的相关文章

python魔法方法-属性访问控制

属性访问控制 所谓的属性访问控制就是控制点号访问属性的行为,而且不仅是类的外部,连类的内部也受控制,代码见真章,边看代码边解释: __getattr__(self, item) 定义当访问不存在的属性时的行为,注意是不存在的属性. class Foo(object): def __init__(self, value): self.value = value def __getattr__(self, item): print item # 查看得到的参数是什么 print type(item)

Python 魔法方法~~

网友写的python魔法方法详情 :详情 魔法方法 含义   基本的魔法方法 __new__(cls[, ...]) 1. __new__ 是在一个对象实例化的时候所调用的第一个方法2. 它的第一个参数是这个类,其他的参数是用来直接传递给 __init__ 方法3. __new__ 决定是否要使用该 __init__ 方法,因为 __new__ 可以调用其他类的构造方法或者直接返回别的实例对象来作为本类的实例,如果 __new__ 没有返回实例对象,则 __init__ 不会被调用4. __ne

Python魔法方法总结及注意事项

1.何为魔法方法: Python中,一定要区分开函数和方法的含义: 1.函数:类外部定义的,跟类没有直接关系的:形式: def func(*argv): 2.方法:class内部定义的函数(对象的方法也可以认为是属性):分为两种: ① python自动产生的(魔法方法):一般形式为 __func__(),python会在对应的时机自动调用该函数: ② 人为自定义的方法:一般和普通函数没有区别,只是定义在了class中而已 3.方法与函数的区别: 方法可认为是函数的特殊情况: ① 方法定义在cla

python魔法方法详解

文章来源:http://blog.csdn.net/koko66/article/details/42709279 据说,Python 的对象天生拥有一些神奇的方法,它们总被双下划线所包围,他们是面向对象的 Python 的一切. 他们是可以给你的类增加魔力的特殊方法,如果你的对象实现(重载)了这些方法中的某一个,那么这个方法就会在特殊的情况下被 Python 所调用,你可以定义自己想要的行为,而这一切都是自动发生的. Python 的魔术方法非常强大,然而随之而来的则是责任.了解正确的方法去使

知识点:Python 魔法方法详解

据说,Python 的对象天生拥有一些神奇的方法,它们总被双下划线所包围,他们是面向对象的 Python 的一切. 他们是可以给你的类增加魔力的特殊方法,如果你的对象实现(重载)了这些方法中的某一个,那么这个方法就会在特殊的情况下被 Python 所调用,你可以定义自己想要的行为,而这一切都是自动发生的. Python 的魔术方法非常强大,然而随之而来的则是责任.了解正确的方法去使用非常重要! 魔法方法 含义 基本的魔法方法 __new__(cls[, ...]) 1. __new__ 是在一个

python 魔法方法(学习过程的笔记)

有小伙伴会问,什么是python的魔法方法,python的魔法方法有什么用呢, 它们在面向对象的Python的处处皆是.它们是一些可以让你对类添加"魔法"的特殊方法. 它们经常是两个下划线包围来命名的. 我感觉魔法方法很牛逼的, 目前我们常见的魔法方法大致可分为以下几类: 构造与初始化 类的表示 访问控制 比较操作 容器类操作 可调用对象 Pickling序列化 在我们写python中最常见的就是__init__,这是python的构造方法,这是初始化对象,定义一个对象的初始化的值,_

Python 魔法方法详解

据说,Python 的对象天生拥有一些神奇的方法,它们总被双下划线所包围,他们是面向对象的 Python 的一切. 他们是可以给你的类增加魔力的特殊方法,如果你的对象实现(重载)了这些方法中的某一个,那么这个方法就会在特殊的情况下被 Python 所调用,你可以定义自己想要的行为(重写该方法),而这一切都是自动发生的. Python 的魔术方法非常强大,然而随之而来的则是责任.了解正确的方法去使用非常重要! 魔法方法 含义   基本的魔法方法 __new__(cls[, ...]) 1. __n

python魔法方法

Python 魔术方法指南 入门 构造和初始化 构造定制类 用于比较的魔术方法 用于数值处理的魔术方法 表现你的类 控制属性访问 创建定制序列 反射 可以调用的对象 会话管理器 创建描述器对象 持久化对象 总结 附录 介绍 此教程为我的数篇文章中的一个重点.主题是魔术方法. 什么是魔术方法?他们是面向对象的Python的一切.他们是可以给你的类增加”magic”的特殊方法.他们总是被双下划线所包围(e.g. __init__ 或者 __lt__).然而他们的文档却远没有提供应该有的内容.Pyth

python魔法方法、构造函数、序列与映射、迭代器、生成器

在Python中,所有以__双下划线包起来的方法,都统称为"魔术方法".比如我们接触最多的__init__,魔法方法也就是具有特殊功能的方法. 构造函数 构造函数不同于普通方法,将在对象创建后自动调用它们.也就是在对象创建完成后,自动会调用__init__方法来初始化. 创建一个构造方法 构造方法传参 >>> class FooBar: def __init__(self,value=42): #默认参数 self.somevar = value >>&g