一、面向对象编程思想(OOP)
参考文末的参考文章
简单来说,面向对象编程的两个重要概念是类和实例。
二、面向对象技术简介
类
方法
类变量
实例变量
数据成员
方法重写
继承
实例化
对象
三、 什么是类与实例
类是基于数据类型和函数进行封装,生成抽象的模板。实例是类的对象化,即基于抽象的模板生成的可供程序调用的对象。每个对象都拥有相同的方法,但各自的数据可能不同。
比喻:
比如现实中,学校的年级是一个类,这个类里面有年级名、年级的班数、年级的授课老师、年级使用的课本、年级的平均分。
具体的某个年级则是年级类的实例,比如有”一年级”这个实例,年级名是一年级;该年级有5个班;该年级的授课老师是张老师和李老师;该年级使用的课本是语文、数学、英语;该年级的平均是90分。
其中年级名、年级班数、年级的授课老师、年级使用的课本是数据,而年级的平均分需要计算,所以这里可以看做是方法。
四、类属性(类变量)
类属性是类中定义的变量。类属性在整个实例化的对象中是公用的。
类属性定义在类中,且在函数体之外。
五、 实例属性(实例变量)
实例属性是类中方法中定义的变量,只对当前实例化的对象有效。
类属性和实例属性的区别,可以看文末的看考文章。
六、类的方法
类的方法和函数一样,都是封装某些代码,实现代码的复用。只是类的方法是定义在类中,并且有一个默认的要传的参数self,这个参数代表类实例化对象的实例名。
4.1 __init__方法
类的特殊方法(关于类的特殊方法,可以看后面的内容),此方法会在实例化时被自动调用,用来做一些初始化的工作。
七、 类的定义
python中通过class关键字定义类,class后面跟类名。类名后面是(object),表示该类从哪个类继承,如果没有继承类,则用object类。这是所有类最终都会继承的类。
定义示例: class Student(object): <statement-1> . . . <statement-N>
类名规则:
通常是大写字母开头
八、类的实例化
类的实例化和变量赋值类似,前面是实例化名,后面是类名称加().
实例化示例:
liang = Student()
示例脚本:
#!/usr/bin/env python3
class Grade(): #定义一个年级类
def __init__(self,gradename,classesnumber,teacher,textbook,engilsh,mathematics,language): #定义初始化方法,用来实现类实例化时赋值
self.gradename = gradename
self.classesnumber = classesnumber
self.teacher = teacher
self.textbook = textbook
self.engilsh = engilsh
self.mathematics = mathematics
self.language = language
def shuchu(self): #输出方法,用来输出信息
print("该年级为:%s"%(self.gradename))
print("该年级有几个班:%s"%(self.classesnumber))
print("该年级的授课老师:%s"%(self.teacher))
print("该年级的课程:%s"%(self.textbook))
print("该年级的英语总分:%s"%(self.engilsh))
print("该年级的数学总分:%s"%(self.mathematics))
print("该年级的语文总分:%s"%(self.language))
def avg(self): #求平均值方法,用来求年级的语数英分数的平均值。
avgfraction = (self.engilsh + self.mathematics + self.language)/3
print("该年级的语数英平均分:%f"%(avgfraction))
x = Grade('一年级','2个','张老师,李老师','语文,数学,英语',10,20,30) #使用Grade类进行实例化,实例化对象为x
x.shuchu() #调用类方法
x.avg() #调用类方法
九、访问限制
1. 类属性和方法的调用
类里面的属性和方法,在实例化后,外部代码可以调用实例变量来操作数据。
调用方式:
属性调用:实例名.属性名
方法调用:实例名.方法名
示例:
#!/usr/bin/env python3
class Student(object):
def __init__(self,name,score):
self.name = name
self.score = score
self.test = "test"
def print_score(self):
print("%s:%s"%(self.name,self.score))
x = Student("centos","90") #基于Student类实例化对象x
print(x.name) #输出实例化后的name属性
print(x.test) #输出实例化后的test属性
x.print_score() #调用实例化后的print_score()方法
输出结果:
centos
test
centos:90
其中x.name的值是在类实例化的时候,通过参数传递的。x.test是在类实例化的时候,在类内部进行赋值的,这里通过实例化名.属性名(x.test)引用。
2. 私有变量
类中的属性,可以不让外部访问,只供类的内部使用。可以在属性前加__两个字符。加上__就代表,这个属性是私有属性,只能在类的内部访问。
示例:
#!/usr/bin/env python3
class Student(object):
def __init__(self,name,score):
self.name = name
self.score = score
self.__test = "test"
def print_score(self):
print("%s:%s"%(self.name,self.score))
x = Student("centos","90") #基于Student类实例化对象x
print(x.name) #输出实例化后的name属性
print(x.test) #输出实例化后的test属性
x.print_score() #调用实例化后的print_score()方法
输出结果:
centos
Traceback (most recent call last):
File "class6.py", line 16, in <module>
print(x.test)
AttributeError: 'Student' object has no attribute 'test'
报错提示Studen没有此test属性
3. 私有方法
私有方法和私有属性一样,在类的方法名称前加上__,即代表此方法是类的内部属性,外部不可调用。
十、继承与多重继承
1. 继承
继承是,我们定义一个类的时候,可以从某个现有的类继承,新的类成为子类,被继承的类成为父类、基类、超类。
比如我们编写了一个名为Test的类,里面有一个run的方法,是直接打印内容。
class Test(object): def run(self,content): print("这是一个测试类的测试方法.用来输出一个传入的内容:%s"%(self.content))
当我们在编写一个新类的时候,如果想使用此方法,则可以直接从Test类继承。
1.1 类如何继承?
在类定义时直接在类名后面的括号内写上要继承的类的名字即可。
1.2 类继承格式:
class DerivedClassName(BaseClassName1): <statement-1> . . . <statement-N> 示例: #!/usr/bin/env python3 class Test(object): #定义Test类 def run(self,content): #定义run方法 self.content = content print("这是一个测试类的测试方法.用来输出一个传入的内容:%s"%(self.content)) class TestTwo(Test): #定义TestTwo类,并继承Test pass x = TestTwo() #使用TestTwo类进行实例化。 print(x.run("haha"))
2. 多重继承
多重继承即指一个新定义的类可以继承多个现有的类。
多重继承的格式:
class DerivedClassName(Base1, Base2, Base3):
<statement-1>
.
.
.
<statement-N>
示例程序:
#!/usr/bin/env python3
class Test(object): #定义第一个类
def run(self,content): #定义第一个方法
self.content = content
print("这是第一个测试类的测试方法.用来输出一个传入的内容:%s"%(self.content))
class TestTwo(object): #定义第二个类
def TwoRun(self,content): #定义第二个类的第二个方法
self.content = content
print("这是第二个测试类的测试方法.用来输出一个传入的内容:%s"%(self.content))
class TestThree(Test,TestTwo):
pass
x = TestThree()
print(x.run("haha"))
print(x.TwoRun("haha"))
3. 方法重写
子类继承自父类的方法,可以在子类中重新写。
重写方法:
在子类中重新定义方法即可。
示例:
#!/usr/bin/env python3
class Test(object):
#定义Test类
def run(self,content):
#定义run方法
self.content = content print("这是一个测试类的测试方法.用来输出一个传入的内容:%s"%(self.content))
class TestTwo(Test):
#定义TestTwo类,并继承Test
def run(self,content):
#重写run方法
self.content = content print("这是继承父类以后,子类重新该写的方法,输入的内容是:%s"%(self.content))
x = TestTwo() #使用TestTwo类进行实例化。
print(x.run("haha"))
十一、特殊方法
python的类中,有一些特殊方法,用来实现特殊的功能,比如前面使用的__init__()
常见的一些特殊方法,可以参考文末的链接。
十二、参考文章
面向对象编程思想
https://www.cnblogs.com/xiaosongluffy/p/5072501.html
http://t.cn/RK0XoCm
廖雪峰python3
http://t.cn/RK05OJC
菜鸟编程
http://www.runoob.com/python3/python3-class.html
python类变量和实例变量
https://www.cnblogs.com/crazyrunning/p/6945183.html
python特殊方法
https://www.cnblogs.com/chang1203/p/5847490.html
https://blog.csdn.net/tyrantu1989/article/details/78499643