面向对象编程

一、面向对象编程思想(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

Previous Post

python编程-函数

Next Post

数据结构

Related Posts