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