Python面向对象和异常

一、Python类和对象简述

1,类:具有相同的属性和方法的对象的集合

2,对象:万物皆对象对象定义  

对象使用:类名(参数) 可以把他赋给一个变量,这样好调用方法和属性

我们可以根据对象,属性来创建属性但这个属性只属于本对象,可以self来调用(self代表本类和Java的this差不多)但这样直接考.出来的属性并不实用,我们一般都是在init函数自己定义属性,这样全局类都可以实用了

3,类的定义:

class 类名:

    属性

def 方法():

二、Python类中常用的函数和方法

 方法

 1,def __new__(cls):用来创建对象,但必须有返回值  (cls代表本类)和Java中的无参构 造差不多

2, def __init__(self,参数): 用来初始化的方法,用来给参数赋值的:(也可以说成Java中的有参构造)

3,def __str__(self):重写父类objectstr方法用来把对象属性进行显示输出,和Java的tostring一样

补充(类函数)

  • __init__ : 构造函数,在生成对象时调用
  • __del__ : 析构函数,释放对象时使用
  • __repr__ : 打印,转换
  • __setitem__ : 按照索引赋值
  • __getitem__: 按照索引获取值
  • __len__: 获得长度
  • __cmp__: 比较运算
  • __call__: 函数调用
  • __add__: 加运算
  • __sub__: 减运算
  • __mul__: 乘运算
  • __div__: 除运算
  • __mod__: 求余运算
  • __pow__: 乘方

 

4,def __del__(self):自动销毁方法,当对象没有引用的时候,程序自动调用__del__()

   Del 引用也可以自动调用__del__(self)方法

5,__方法名(self):私有方法只有本类可以访问

函数

1,getrefcount(对象) 返回有多少个对象引用

三、继承 

 1,继承:子类继承父类,子类可以拥有父类的属性和方法,简化代码,

当生成子类对象时,先初始化父类对象,使用如果父类有__init__方法并且有属性,要通过子类的构造赋值一个类可以有多个类和父类

在子类调用父类属性的时候,可以有4种调用方式

1, 父类.属性

2, self.属性

3, 父类.__init__(self,参数)

4, super(父类,self).__init__(所有参数)

一个基础体系

(注意:调用父类用方法和属性用super)

1,父类()
子类(父类)
三代继承:子类初始化方法需要祖父、父类及自己的属性,可以调用父类的初始化方法传参,可以重写父类的方法
构造的顺序依然先构造祖父类,再构造父类,最后构造自己
类继承object
2,方法重写:
如果子类重写的方法想调用父类的方法时,在子类方法中:父类.方法(self)或super().父类方法()
3,多继承:

类同时继承多个父类,class C(A,B),当有AB均有相同方法,调用前面的

(注意:如果多继承用的传参方式不同可能结果不一样

两段代码运行结果不一样:  
原因:第一个使用父类名调用,相当于Parent重写了2次;   
第二个使用super调用,相当于Parent重写了1次所以导致两次结果不一样,第一次那样调用是存在问题的,  
1、super().__init__相对于类名.__init__,在单继承上用法基本无差  
2、但在多继承上,super保证每个父类只会被重写一次,如果使用类名调用时,就会出现多次调用  
3、多继承时,使用super方法,对父类的传参数,应该是由于python中super的算法导致的原因,必须把参数全部传递,否则会报错  
4、多继承时,相对于使用类名.__init__方法,要把每个父类全部写一遍, 而使用super方法,只需写一句话便执行了全部父类的方法,这也是为何多继承需要全部传参的一个原因。

四,多态

多态

类具有继承关系,并且子类类型可以向上转型看做父类类型,如果我们从 Person 派生出 Student和Teacher ,并都写了一个 whoAmI() 方法:

在一个函数中,如果我们接收一个变量 x,则无论该 x 是 Person、Student还是 Teacher,都可以正确打印出结果:

def who_am_i(x):
    print(x.whoAmI())

p = Person('Tim', 'Male')
s = Student('Bob', 'Male', 88)
t = Teacher('Alice', 'Female', 'English')

who_am_i(p)
who_am_i(s)
who_am_i(t)

运行结果:

 

这种行为称为多态。也就是说,方法调用将作用在 x 的实际类型上。s 是Student类型,它实际上拥有自己的 whoAmI()方法以及从 Person继承的 whoAmI方法,但调用 s.whoAmI()总是先查找它自身的定义,如果没有定义,则顺着继承链向上查找,直到在某个父类中找到为止。

由于Python是动态语言,所以,传递给函数 who_am_i(x)的参数 x 不一定是 Person 或 Person 的子类型。任何数据类型的实例都可以,只要它有一个whoAmI()的方法即可:

这是动态语言和静态语言(例如Java)最大的差别之一。动态语言调用实例方法,不检查类型,只要方法存在,参数正确,就可以调用。

 

1,类属性:属于类的成员,属于对象共有的

2,类方法:在方法上添加@classmethod

可以通过类方法调用类属性,也可以通过对象调用类属性

3,静态方法:

他不属于类也不属于对象

4工厂类:有一些子类,在一个类中生成很多对象,简单工厂模式

Pass

五、常用的函数

1,对象排序

(1) 按非中文排序

    

(2)  按中文排序

2,单例模式

   单例模式:有且仅有一个对象

六、异常

1, 捕捉异常可以使用try/except语句

如果有异常会进入except里面

2, Else是没有异常会执行的语句

3, Finally是不管这样都执行

注意:异常我们主要记住这两就没什么问题了



 

猜你喜欢

转载自blog.csdn.net/weixin_41122339/article/details/80545701