python类

  1. python类
    1. 创建自定义类
    2. 多继承
    3. 抽象基类
    4. 构造函数
    5. 函数 property
    6. 其它魔法方法
    7. __iter__迭代器
      1. 从迭代器创建序列
  2. 生成器yield
    1. 发送消息到内部

python类

本书前面反复提到了类,并将其用作类型的同义词。从很多方面来说,这正是类的定义—— 一种对象。每个对象都属于特定的类,并被称为该类的实例。
python中的类也是对象,是特殊的对象罢了。跟C++中的类完全不一样,C++中的类是数据类型,python的类是类似数据类型的对象

创建自定义类

class Person:
    def set_name(self, name):
        self.name = name

    def get_name(self):
        return self.name

    def greet(self):
        print("Hello, world! I'm {}.".format(self.name))

多继承

python中,父类也叫超类
注意:如果多个超类以不同的方式实现了同一个方法必须在class语句中小心排列这些超类,因为位于前面的类的方法将覆盖位于后面的类的方法。

class Calculator:
    def calculate(self, expression):
        self.value = eval(expression)

class Talker:
    def talk(self):
        print('Hi, my value is', self.value)

class TalkingCalculator(Calculator, Talker):
pass

>>> tc = TalkingCalculator()
>>> tc.calculate('1 + 2 * 3')
>>> tc.talk()
Hi, my value is 7

抽象基类

形如@this的东西被称为装饰器 来将方法标记为抽象的——在子类中必须实现的方法.
抽象类(即包含抽象方法的类)最重要的特征是不能实例化。

构造函数

在Python中,创建构造函数很容易,只需将方法init的名称从普通的init改为魔法版”__init__“即可。

Python提供了魔法方法”__del__“,也称作析构函数(destructor)。这个方法在对象被销毁(作为垃圾被收集)前被调用,但鉴于你无法知道准确的调用时间,建议尽可能不要使用”__del__“。

class FooBar:
    def __init__(self, value=42):
        self.somevar = value

>>> f = FooBar('This is a constructor argument')
>>> f.somevar
'This is a constructor argument'

函数 property

class Rectangle:
    def __init__ (self):
        self.width = 0
        self.height = 0

    def set_size(self, size):
        self.width, self.height = size

    def get_size(self):
        return self.width, self.height

    size = property(get_size, set_size)

>>> r = Rectangle()
>>> r.width = 10
>>> r.height = 5
>>> r.size
(10, 5)
>>> r.size = 150, 100
>>> r.width
150

实际上,调用函数property时,还可不指定参数、指定一个参数、指定三个参数或指定四
个参数。

其它魔法方法

要在属性被访问时执行一段代码,必须使用一些魔法方法。
__getattribute__(self, name):在属性被访问时自动调用(只适用于新式类)。
__getattr__(self, name):在属性被访问而对象没有这样的属性时自动调用。
__setattr__(self, name, value):试图给属性赋值时自动调用。
__delattr__(self, name):试图删除属性时自动调用。

__iter__迭代器

方法__iter__返回一个迭代器,它是包含方法__next__的对象,而调用这个方法时可不提供任何参数。当你调用方法__next__时,迭代器应返回其下一个值。如果迭代器没有可供返回的值,应引发StopIteration异常。

实现了方法__iter__的对象是可迭代的,而实现了方法__next__的对象是迭代器。

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

>>> fibs = Fibs()
>>> for f in fibs:
... if f > 1000:
... print(f)
... break
...
1597
从迭代器创建序列
>>> class TestIterator:
...     value = 0
...     def __next__(self):
...         self.value += 1
...         if self.value > 10: raise StopIteration
...         return self.value
...     def __iter__(self):
...         return self
...
>>> ti = TestIterator()
>>> list(ti) 
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

生成器yield

def flatten(nested):
    for sublist in nested:
        for element in sublist:
            yield element

>>> nested = [[1, 2], [3, 4], [5]]
>>> for num in flatten(nested):
... print(num)
...
1
2
3
4
5
发送消息到内部
def repeater(value):
    for i in range(10):
        x = (yield i) #这块会阻塞,send发来的值给x
        #print(x)

r = repeater(42)

print(next(r))
print(r.send("hello"))
print(next(r))

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 68813175@qq.com