面向对象编程的术语
类,属性和方法的对象集合
对象,类的实例
方法(成员),类中的函数
属性,类中的变量
封装与隐藏,抽象方法与属性,和权限的设置
继承与派生
类的定义与使用
class 类名:
属性的定义直接或__init__
函数的定义 def 函数名
class animal:
maxold = 200 #公共变量
__newold = 0 #"__"私有变量
def __init__(self,name,age,sex):#定义属性
animal.__newold += 1 #访问类变量要加类名,def 以外的是类变量
self.name = name
self.age = age
self.sex = sex
self的作用
self表示当前对象
__init__的类函数是特殊函数,每当实列化元素就会运行该函数
class 类:
def __init__(self,属性1,属性2):#初始self
self.属性1(任意变量名) = 属性1 #属性1赋值给
self.属性2(任意变量名) = 属性2
def printf(self): 将由self. 为前缀的属性值继承在该成员中
print(self.属性1)
print(self.属性2)
a = 类(数值1,数值2) #实例化
类.printf() #由类名来调用成员
>>>
属性1
属性2
class 类:
def __init__(self,属性1,属性2):#初始self
self.属性1(任意变量名) = 属性1 #属性1赋值给
self.属性2(任意变量名) = 属性2
age = 6 #不给予self,self就不会引用
def printf(self): 将由self. 为前缀的属性值继承在该成员中
print(self.属性1)
print(self.属性2)
print(age) #本段会报错,因为没有引用到age
a = 类(数值1,数值2) #实例化
类.printf() #由类名来调用成员
return self
就是返回自身
继承与派生
class person():
def __init__(self,name,age):
self.name = name
self.age = age
def getNameAge(self):
print("{:}学生{:}".format(self.name,self.age))
def getName(self):
return self.name
class teacher(person):
def __init__(self,name,age,sub):
person.__init__(self,name,age) #!!就是继承的方法
self.subject = sub
def getNameAge(self):
print("{:}老师{:}.format(self.name,self.age))#与继承类同一方法名,继承的话,会覆盖父类的方法
per1 = person("tom",20)
per1.getNameAge()
sir1 = teacher("wang",33,"math")
sir1.getNameAge()
print(sir1.getname())#这个是在父类继承到的方法
注意在父类继承到的方法
1:在多重继承中,派生类中如果调用的方法是多个继承中都有的,为了不产生歧义,调用第一个的方法
递代器与生成器
递代器(后面补充)
迭代器是一个可以遍历而且自己记录遍历位置的对象。它的工作模式属于“懒惰模式”,也就是在调用迭代器时才会返回下一个元素。这样在处理海量数据时就无须预先产生大量数据或者把大量数据加载到内存。迭代器从数据的第一个元素开始访问,直到所有的元素被访问完结束,迭代器只能单向往前,不可以后退,因此迭代器内部需要维护自己的状态。
一个类如果实现了__ iter__和__next__方法就属于迭代器类。迭代器是一个有状态的对象,在调用next()的时候返回下一个值,如果没有更多元素,就会抛出(raise) Stoplteration 异常。
以下是一个迭代指定范围内素数的迭代器类。
pass
生成器(后面补充)
生成器也是可迭代的,但它不用实现__iter__ 和__next__方法,只需要使用关键字yield。下面使用生成器实现了类似上面素数迭代器的功能。
yield的解释
可以先看成return,运行完后暂停,当在次运行该函数时就在该位置在继续往后运行,而不是重头开始
1.程序开始执行以后,因为函数中有yield关键字,所以函数并不会真的执行,而是先得到一个生成器(相当于一个对象)
2.生成器.send()
不能向刚刚生成的生成器发送数据