python3.5--8面向对象

你。 提交于 2019-11-27 08:08:34

面向对象

  1. 面向对象基本术语
    ▶类:用来描述具有相同属性和方法的对象的集合。类定义了集合中每个对象共有的属性和方法。对象是类的实例。
    ▶类变量(属性):类变量在整个实例化的对象中是公用的。类变量定义在类中,且在方法之外。类变量通常不作为实例变量使用。
    ▶实例变量:定义在方法中的变量,只作用于当前实例的类。
    ▶数据成员:类变量或者实例变量用于处理类及实例对象的相关数据。
    ▶方法重写:如果从父类集成的方法不能满足子类的需求,就可以对其进行改写,这个过程称为方法的覆盖(override)。
    ▶多态(Polymorphism):对不同类的对象使用同样的操作。
    ▶封装(Encapsulation):对外部世界隐藏对象的工作细节。
    ▶继承(Inheritance):即一个派生类(derived class) 继承基类(base class) 的字段和方法。继承允许吧一个派生类的对象座位一个基类对象对待,以普通类为基础建立专门的类对象。
    ▶实例化(Instance):创建一个类的实例、类的具体对象。
    ▶方法:类中定义的函数。
    ▶对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。
  2. 类的使用
class MyClass(object):
            i=123
            def f(self):     #定义类的方法时,第一个参数必须为self,除了self不用传入,其他参数正常传入
                     return 'hellworld'
 use_class=MyClass()    #累的实例化,此处得到的user_class变量称为类的具体对象
 print('调用类的属性:',user_class.i)
 print('调用类的方法:',user_class.f())

执行结果:
调用类的属性:123
调用类的方法:hellworld                
  1. 类的构造方法
    def __init__(self): 初始化,在定义类时,若不显示的定义一个__init__()方法,则默认调用一个无参的__init__()方法
    一个类中可定义多个构造方法,但实例化类时只实例化最后的构造方法,即后面的构造方法会覆盖前面的构造方法,并且需要根据最后一个构造方法的形式进行实例化。建议一个类只定义一个构造函数。
    在这里插入图片描述

  2. 类的访问权限
    私有变量(private):变量名以__开头,则只有内部可以访问,外部不能访问,只有通过增加get_attrs才可以获取
    私有方法:方法名以__开头,且不能在类外使用

    class Student(object):
                    def __init__(self,name,score):  #构造方法
                                  self.__name=name  #私有变量
                                   self.__score=score  #私有变量
                                       
                      def info(self):       #公共方法
                                    print('学生:%s;分数:%s'%(self.__name,self.__score))
                       def __foo(self):   #私有方法
                                     print('学生:%s;分数:%s'%(self.__name,self.__score))                
                                       
                       def get_score(self):  #获取私有变量
                                      return self.__score
                                      
                        def set_score(self,score):  #更改私有变量
                                       self.__score=score        
    
    stu=Student('xiaomeng',95)
    stu.info()
    stu.__foo #报错,私有方法不可外部调用
    stu.__score #报错,私有变量不可外部调用
    stu.get_score()
    stu.set_score(0)                                                         
    
  3. 继承:当定义一个class时,可以从某个现有的class继承,定义新class称为子类(subcalss),二被继承的class称为基类、父类或超类(Base class、Supper class)。
    定义:class DerivedClassName(BaseClassName):
    statement-1


    statement-N
    继承特点:①在继承中,基类的构造方法不会被自动调用,需要在子类的构造方法中专门调用。
    ②在调用基类的方法是需要加上基类的类名前缀,并带上self参数变量。区别与在类中调用普通函数式不需要带self参数。
    ③首先查找对应类型的方法,如果在子类中找不到对应的方法,才到基类中逐个查找。
    ④子类获取父类全部非私有的功能,父类的私有方法不能继承或调用。

  4. 多态:当子类和父类存在相同的方法是,子类的方法会覆盖父类的方法,在代码运行时总会调用子类的方法。

  5. 封装:全局作用去榆中其他区域隐藏多余信息的原则。

    class Student(object):
                    def __init__(self,name,score):  
                                  self.name=name 
                                   self.score=score
    
    def info(self):
              print('学生:%s;分数:%s'%(self.name,self.score))
              
    stu=Student('xiaomeng',95)  
    info(stu)                          
    
  6. 多重继承:一个子类可以继承多个父类,同事获得多个弗雷所有非私有功能。
    定义: class DerivedClassName(Base1,Base2,Base3):
    statement-1


    statement-N

  7. 获取对象类型方法:type()、isinstance()、dir()

  8. 类专有方法:
    str:直接显示变量调用的不是__str__(),而是__repr__(),两者区别在于__str__()返回用户看到的字符串,而__repr__()返回程序开发者看到的字符串,所以__repr__()是为了调试服务的。
    iter:如果想将类用于for …in循环,就不续实现__iter__()方法。该方法返回一个迭代对象,for循环会不断调用改迭代对象的__next__()方法,活的循环的下一个值,知道遇到StopIteration错误时退出循环。

# -*- coding:utf-8 -*-

class Fib(object):
               def __init__(self):
                               self.a,self.b=0,1 #初始化两个计数器a、b
               def __iter__(self):
                              return self  #实例本身就是迭代对象,所以返回自己
               def __next__(self):
                               self.a,self.b=self b,self.a+self.b #计算下一个值
                               if self.a>100: #退出循环条件
                                                        raise  StopIteration();
                                return self.a  #返回下一个值

for n in Fib():
             print(n)                                                            
                               

getitem:Fib实例虽然能够作用于for循环,和list有点像,但是不能像list一样按照下标取出元素,需要实现__getitem__()方法

class Fib(object):
                  def __getitem__(self,n):
                                       a,b =1,1
                                       for x in range(n):
                                                      a,b=b,a+b
                                        return a
fib=Fib()
fib[3]                                                      

getattr:当调用一个不存在的属性时,可以通过__getattr__返回一个动态属性,避免报错,默认范围None

class Student(object):
                     def __init__(self):
                                           self.name='xiaozhi'
                     def  __getattr__(self,sttr):
                                           if attr=='None':
                                                      return 0                   

call:直接对实例进行调用,可以通过callable()函数判断一个对象能否被调用
在这里插入图片描述

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!