构造方法,代表类似于以前例子中使用过的那种名为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)
重写是继承机制中的一个重要内容,对于构造方法尤其重要。构造方法用来初始化新创建对象的状态,大多数子类不仅要拥有自己的初始化代码,还要拥有超类的初始化代码。有时会遇到一个问题:如果一个类的构造方法被重写,那么就需要调用超类的构造方法,否则对象可能不会被正确地初始化。
【我的理解:类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
访问器可以使用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
静态方法:
在创建时被装入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()
进行迭代:在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__方法的对象是迭代器。
任何包含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]