目录
1 面向对象编程
在python中,所有数据类型都可以视为对象,当然也可以自定义对象,自定义的对象数据类型就是面向对象中类(Class)的概念。
通过一个例子加深理解
1.1 面向过程编程
假如我们想要处理学生的成绩
std1 = {'name':'xiaoyang','score':95}
std2 = {'name':'xiaoxun','score':88}
std1,std2
def count(name,score):
print("名字是%s,得分是%s" %(name,score))
count('xiaosun',120)
1.2 面向对象编程
如果采用面向对象编程,我们首选思考不是程序的执行流程,而是一个数据类型被视为一个对象,像个对象拥有xxx和xxx属性,
#面向对象编程
class Student():
def __init__(self,name,score):
self.name = name
self.score = score
def print_score(self):
print("名字是%s,成绩是%s" %(self.name,self.score))
#调用实例
a = Student('xiaoyang',140)
a.print_score()
以本例子解释,Student就是Class类是指学生这个概念,而xiaoyang这个具体的概念则是一个实例(instance),都是指向一个个具体的学生。
2 类和实例
面向对象最重要的概念就是类和实例,类是抽象的模板,例如上个例子的Student,而实例时根据类创建出来的一个个具体的对象,
class Turtle:#python中的类名约定以大写字母开头
#属性
color = 'green'
weight = 10
legs = 4
shell = True
mouth = '大嘴'
#类的方法
def climb(self):
print('我正在很努力的向前爬')
def run(self):
print('我正在飞快的向前跑')
def bite(self):
print('咬死你')
def eat(self):
print('有的吃,真满足')
def sleep(self):
print('困了睡觉')
tt = Turtle()
print(tt)
tt.climb()
tt.bite()
#用类学唱歌
class Song():
def __init__(self,lyrics):
self.lyrics = lyrics#实例变量
def print_lyrics(self):
for line in self.lyrics:
print(line)
c = Song('abcdefghigkimnopqrstucwxyz')#调用实例打印英文字母哥
c.print_lyrics()
def__init__(self,parm1...) 这是类的初始化方法,构造方法, 根据类创建对象时自动执行,
#用类学唱歌
class Song():#定义一个Song类
lyrics = '1234567'#类变量lyrics
#def __init__(self):#定义个init函数带有self和lyrics参数
#self.lyrics = lyrics#实例变量
def print_lyrics(self):#定义一个print_lyrics类的方法,
print(self.lyrics)
c = Song()#调用类
c.print_lyrics()#调用实例中类的方法
#这个例子中lyrics时类的变量
b = Song()
Song.lyrics= '12312414155'#修改类变量
print(b.lyrics)
上述例子变量lyrics属于类变量,类变量特点是所有类的实例化对象都同时共享类变量,类变量在所有实例化对象中是作为公共资源存在的。
3 词汇训练
classX(Y):创建一个名为X并继承自Y的类
classX(object):def__init__(self,j):类X有一个带有self和J参数的init函数
class X(object):def M(self,J): 类X带有一的self和J参数的M函数
foo = X(): 设foo 为X的一个实例
foo.M(J):从foo哪里获得M函数,并用self和参数J调用它
foo.K = Q :从foo哪里获得K属性,并设它为Q
4 继承
#继承父类初始化过程中的参数
class Father():#定义一个父类
def __init__(self,a,b):类的构造方法init函数里面包含a,b参数
self.a =a#实例对象
self.b = b
def dev(self):#定义一个dev函数里包含self
return self.a -self.b#函数返回值a-b
#调用父类初始化参数a,b并额外增加参数c
class Son(Father):#定义一个Son类继承自Father
def __init__(self,a,b,c=10):#init函数包含self,a,b,c=10,参数
Father.__init__(self,a,b)#继承父类的构造方法以及a,b参数
self.c = c#实例对象
def add(self):#定义add类的方法
return self.a +self.b#返回a+b
def copmpar(self):#定义copmpar类的方法
if self.c >(self.a+self.b):#条件判断c的值是否大于a+_b
return True#大于的华返回True
else:
return False#小于则返回False
s= Son(1,2,1)#创建实例并传入参数a,b,c,此时c的值成为1
s.dev()#调用实例中dev方法,子类继承父类的全部方法,因为子类没有重写父类的方法,调用父类方法
s.add()#调用实例中ad方法
s.copmpar()
4.1 调用父类init方法
#调用父类init方法
class Father():
def __init__(self):
self.a= a
class Son(Father):
def __init__(self):
pass
s = Son()
print(s.a)
如果子类自己也定义了__init__方法,那么父类属性时不能直接调用的,会报错
super()函数
在解决多继承问题,python引入了super()机制
#修改一下
#调用父类init方法
class Father():
def __init__(self):
self.a= 'aaa'
class Son(Father):
def __init__(self):
super().__init__()#这里也可以用Father.__init__(self)这个方法里self一定加上
s = Son()
print(s.a)
5 私有变量理解
#继承
class people:
#定义基本属性
name = ''
age = 0
#定义一个私有属性
__weight = 0
#定义类的方法
def __init__(self,n,a,w):#init方法包含self,n,a,w参数
self.name = n#实例对象
self.age = a
self.__weight = w
def speak(self):
print("%s说:我%d岁 。"%(self.name,self.age,self.__weight))
#单继承示例
class student(people):#继承了people
grade = ''
def __init__(self,n,a,w,g):
#调用父类的构函
people.__init__(self,n,a,w)
self.grade = g
def speak(self):
print("%s说:我%d岁,读%d年级 。"%(self.name,self.age,self.grade))
s= student('小孙',10,60,3)
s.speak()
变量前面使用__下划线表示这个变量是私有变量,只能在类内调用
参考