Python小白学习-06【方法、属性、迭代器】

1  构造方法

构造方法,代表类似于以前例子中使用过的那种名为init的初始化方法
构造方法和其他普通方法不同的地方在于,在一个对象被创建后,
会立即调用构造方法。

#构造方法,代表类似于以前例子中使用过的那种名为init的初始化方法
#构造方法和其他普通方法不同的地方在于,在一个对象被创建后,
#会立即调用构造方法。
class FooBar:
    #一般初始化方式
    def __init__(self):
        self.somevar = 42
    #构造方法传参数
    def __init__(self,value=41):
        self.somevar = value
f = FooBar()
res = f.somevar
print(res)

f = FooBar(36)
res = f.somevar
print(res)

1.1 重写

重写是继承机制中的一个重要内容,对于构造方法尤其重要。构造方法用来初始化新创建对象的状态,大多数子类不仅要拥有自己的初始化代码,还要拥有超类的初始化代码。有时会遇到一个问题:如果一个类的构造方法被重写,那么就需要调用超类的构造方法,否则对象可能不会被正确地初始化。

【我的理解:类A是类B的超类,

类B的构造特性没有说明A的构造特性,

因此,导致在执行类B时,不能具有A的构造特性中特性。】

为了能够有超类的构造特性,可以使用两种方法:

(1)调用超类的构造方法的未绑定版本。旧版修改方法:在类B的构造方法中加入:【类A.__init__(self)】

(2)使用super函数。在子类B中,直接使用super( 类B , self ).__init__()        super().__init__()

根据教程中的例子,如下所示:

class Bird:
    def __init__(self):
        self.hungry = True
    def eat(self):
        if self.hungry:
            print('Aaah')
            self.hungry = False
        else:
            print('No,thanks')

class SongBird(Bird):
    def __init__(self):
        # super(SongBird,self).__init__()  #方法1
        super().__init__()  #方法2
        self.sound = "Squawk"
    def sing(self):
        print(self.sound)

Han = SongBird()
Han.eat()
Han.eat()
Han.eat()

----------------------------------------------------
运行结果:
Aaah
No,thanks
No,thanks

2  属性

2.1  property函数

访问器可以使用getHeight、setHeight得到或者重绑定一些特性
当程序员使用这个类时不应该还要考虑它是怎么实现的(封装)
解决的方法是:Python能够隐藏访问器方法,让所有特性看起来一样。这些通过访问器定义的特性称为属性。

__metaclass__ = type  #property属性要加的
class Rectangle():
    def __init__(self):
        self.width = 0
        self.height = 0
    def setSize(self,size):
        self.width,self.height = size
    def getSize(self):
        return self.width,self.height
    size = property(getSize,setSize)

r = Rectangle()
r.width = 10
r.height =5
print(r.size)
print('------------------')
r.size = 100,50
print(r.width)

*----结果----*
(10, 5)
------------------
100

2.2 静态方法和类成员方法(没有get到这部分的意义)

静态方法:

在创建时被装入Staticmethod类型的对象中;

定义中没有self参数,且能够被类本身直接调用。

类成员方法:

在创建时被装入Classmethod类型的对象中;

定义时需要名为cls的类似于self的参数,类成员方法可以直接用类的具体对象调用。

#普通类
class MyClass:
    def smeth(self):
        print('This is a static method')
    def cmeth(self):
        print("This is a class method ")
MC = MyClass()
MC.smeth()
MC.cmeth()
print('****************************************')
#实现方法和新式属性的实现方法类似的特征
__metacalss__ = type
class MyClass:
    @staticmethod#静态方法
    def smeth():#没有self参数
        print('This is a static method')
    @classmethod#类成员方法
    def cmeth(cls):#有cls参数,类似于self参数
        print("This is a class method of",cls)
MyClass.smeth()#不用实例化
MyClass.cmeth()

3  迭代器

进行迭代:在for循环中对序列和字典进行迭代  &&  对其他的对象进行迭代(实现__iter__的对象)

class TestIterator:
        value = 0
        def __next__(self):   #python2中--def next(self): 实现的是next方法。Python3中是内建函数
            self.value += 1
            if self.value > 10:raise StopIteration
            return self.value
        def __iter__(self):
            return self
ti = TestIterator()
print(list(ti))  #从迭代器得到序列
--------------------
结果:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

书上说:一个实现了__iter__方法的对象时可迭代的,一个实现了__next__方法的对象是迭代器。

4 生成器

任何包含yield语句的函数称为生成器。除了名字不同以外,它与普通的函数有很大的区别。

生成器是由两部分组成:

生成器的函数:用def语句定义的,包含yield的部分

生成器的迭代器:函数返回的部分

生成器:

def flatten(nested):
    try:
        for sublist in nested:
            for element in flatten(sublist):
                yield element
    except TypeError:
        yield nested

nested = [
    [2,3],
    [5,6],
    [7,9]
]
print list(flatten(nested))
#*********res**********
#[2, 3, 5, 6, 7, 9]

任何一个生成器都可以用普通的函数模拟的:

def flatten(nested):
    result = []
    try:
        try:
            nested + ''
        except TypeError:
            pass
        else:
            raise TypeError
        for sublist in nested:
            for element in sublist:
                result.append(element)
    except TypeError:
        result.append(nested)  #当<三层子列表时,直接执行此行操作。
    return result
nested = [
    [1,2]
    ]
res=flatten(nested)
print res
#*********res**********
#[1,2]

 

你可能感兴趣的:(Python)