wstlwl 发表于 2018-8-12 12:50:08

Python基础,面向对象

  几个名词知识:
  类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
  类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。
  实例变量:定义在方法中的变量,只作用于当前实例的类。
  数据成员:类变量或者实例变量用于处理类及其实例对象的相关的数据。
  方法:类中定义的函数。
  方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。

  继承:即一个派生类(derived>  实例化:创建一个类的实例,类的具体对象。
  对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。
  类定义语法格式如下:
# E:\Python36  
# coding=GBK
  
class classname:
  
    script……
  类实例化后,可以使用其属性,实际上,创建一个类之后,可以通过类名访问其属性。
  类对象支持两种操作:属性引用和实例化。
  例如:
# E:\Python36  
# coding=GBK
  
#类定义
  
class people:
  
    #定义基本属性
  
    #name = ''
  
    age = 1
  
    def f(self):
  
      return 'hello world'
  

  
# 实例化类
  
b = people()
  

  
# 访问类的属性和方法
  
print("people类的属性age为:", b.age)
  
print("people类的方法f输出为:", b.f())
  执行以上程序输出结果为:
  people类的属性age为:1
  people类的方法f输出为: hello world
  定义类的时候是可以定义为一个可以初始化的类,因此类可能会定义一个名为 __init__() 的特殊方法(就是所谓的构造方法),类的实例化操作会自动调用 __init__() 方法。
  当然, __init__() 方法可以有参数,参数通过 __init__() 传递到类的实例化操作上。
  例如:
# E:\Python36  
# coding=GBK
  
#类定义
  
class people:
  
    #定义基本属性
  
    #name = ''
  
    #age = 0
  
    #定义构造方法,用于初始化
  
    def __init__(self,n,a):
  
      self.name = n
  
      self.age = a
  

  
    def speak(self):
  
            print(self.name , self.age)
  

  
if __name__ == '__main__':
  
    #实例化
  
    p = people('jack',25)
  
    p.speak()
  输出结果为:jack 25
类的方法
  在类地内部,使用def关键字可以为类定义一个方法,与一般函数定义不同,类方法必须包含参数self,且为第一个参数:
  例如:class_people.py
#!/usr/bin/env python  
# -*- coding: UTF-8 -*-
  
#类定义
  
class people:
  
    #定义基本属性
  
    # name = ''
  
    # age = 0
  
    #定义构造方法,用于初始化
  
    def __init__(self,n,a):
  
      self.name = n
  
      self.age = a
  

  
    def speak(self):
  
      print("我叫{0},今年{1}岁了!" .format(self.name, self.age))
  

  
if __name__ == '__main__':
  
    p = people('jack',25)
  
    p.speak()
  执行代码输出结果:我叫jack,今年25岁了!
  继承
  在这里我应用了模块,模块就是一个包含所有你定义的函数和变量的文件,其后缀名是.py。模块可以被别的程序引入,以使用该模块中的函数等功能。
  写一个类(student)来继承类(people),people应用模块引入的方式,
  如下:class_student.py
#!/usr/bin/env python  
# -*- coding: UTF-8 -*-
  
from class_people import people as p
  
#单继承示例,继承people
  
class student(p):
  
    # grade = ''
  
    def __init__(self,n,a,g):
  
      #调用父类的构函
  
      p.__init__(self,n,a)
  
      self.grade = g
  

  
    #重写父类的方法
  
    def speak(self):
  
      print("我叫%s,现在%d岁了,我是一个在校学生,在读%s年级"%(self.name,self.age,self.grade))
  

  
if __name__ == '__main__':
  
    s = student('jack',25,'大学三')
  
    s.speak()
  执行代码输出结果为:
  我叫jack,现在25岁了,我是一个在校学生,在读大学三年级
  多继承
  这里再增加一个类
  
  这里有用到了一个知识点:__name__属性
  一个模块被另一个程序第一次引入时,其主程序将运行。如果我们想在模块被引入时,模块中的某一程序块不执行,我们可以用__name__属性来使该程序块仅在该模块自身运行时执行。
  例如:class_speaker.py
#!/usr/bin/env python  
# -*- coding: UTF-8 -*-
  
from class_people import people as p
  
class speaker(p):
  
    # topic = ''
  
    # 构造方法
  
    def __init__(self,n,a,t):
  
      p.__init__(self,n,a)
  
      self.topic = t
  

  
    def speak(self):
  
      print("我叫%s,今年%d岁,是一个演说家,我今天演讲的主题是%s"%(self.name,self.age,self.topic))
  

  
if __name__ =='__main__':
  
    s = speaker('jack',25,'Python')
  
    s.speak()
  执行代码输出结果为:
  我叫jack,今年25岁,是一个演说家,我今天演讲的主题是Python
  下面我们来写一个多继承的代码:
  如下:class_sample.py
#!/usr/bin/env python  
# -*- coding: UTF-8 -*-
  

  
from class_student import student as t
  
fromclass_speaker import speaker as s
  
# 多继承,继承学生和演说家
  
class sample(t,s):
  
    # a =''
  
    def __init__(self,n,a,g,t1):
  
      t.__init__(self,n,a,g)
  
      s.__init__(self,n,a,t1)
  
    # 重写父类方法
  
    def speak(self):
  
      print("我叫%s,今年%d岁了,是一个%s的学生,我还是一个演说家,我今天演讲的主题是%s"%(self.name,self.age,self.grade,self.topic))
  

  
if __name__ == '__main__':
  
    test = sample("jack",25,'大四',"Python")
  
    test.speak()   #方法名同,默认调用的是在括号中排前地父类的方法
  执行代码,运行结果为:
  我叫jack,今年25岁了,是一个大四的学生,我还是一个演说家,我今天演讲的主题是Python
  有结果我们可以看出,类class_speaker中的方法并没有运行,因此每个模块都有一个__name__属性,当其值是'__main__'时,表明该模块自身在运行,否则是被引入。
页: [1]
查看完整版本: Python基础,面向对象