Python3 面向对象

xiaoxiao2021-02-28  93

python从开始就是一个面向对象的语言。

基本概念

类-class:用来描述具有相同属性和方法的对象的集合。定义了集合中每个对象所共有的属性和方法;对象是类的实例

类变量:类变量在整个实例化的对戏那个中式公用的;类变量定义在类中,并在函数体之外。

数据成员:类变量或者实例变量用于处理类以及实例对象的相关数据

方法重写:如果从父类继承的方法不能满足子类的需求,可以进行改写,叫方法覆盖;

实例变量:顶izai方法中的变量,制作用于当前实例的类

继承:一个派生类继承基类的字段和方法;

实例化:创建一个类的实例,类得具体对象

方法:类中定义的函数

对象:通过类定义的数据结构实例

类定义

class classname: <statement1> ... <statementn>类实例化后,可以使用其属性

类对象

类对象支持两种操作:属性引用和实例化;

属性引用使用和python中的所有属性引用一样的标准方法: ojbect.name

类对象创建后,雷命名空间的所有命名都是有效属性名。类定义和实例化

[root@centos7 ~]# vim 2.py import 1.py #!/usr/bin/env python class class1: n=123 def f(self): return 'hello world' #实例化 x = class1() #访问类的属性和方法 print('class1 类的属性n为:',x.n) print('class1 类的方法 f输出:',x.f()) 创建了一个新的类实例并将该对象赋给局部变量 x,x 为空的对象;输出:

[root@centos7 ~]# ./2.py class1 类的属性n为: 123 class1 类的方法 f输出: hello world很多泪都倾向于将对象创建为由出事状态的,可以使用一个__init__()的特殊方法--构建方法

def __init__(self): self.data = []然后,类的实例化操作会自动调用此方法,比如x = class1() ,想c++中的构造函数一样;也可以使用带参数的方法

>>> class comp: ... def __init__(self,realpart,imagepart): ... self.r=realpart ... self.i=imagepart ... >>> x = comp(1.0,4.0) >>> x.r,x.i (1.0, 4.0)

self代表类的实例

类的方法与普通的函数只有一个区别,他们必须有一个额外的第一个参数名,常规的叫self

>>> class test: ... def p(self): ... print(self) ... print(self.__class__) ... >>> t = test() >>> t.p() <__main__.test object at 0x7f3ec6044eb8> <class '__main__.test'>可以看出,self代表类的实例,代表当前对象的地址,self.class 则指向类。其中self不是关键字,换成别的也可以

类的方法

类的内部,使用def关键字可以为类定义一个方法,与一般的函数定义不同,类方法必须包含参数self,且为第一个参数

[root@centos7 ~]# vim 2.py #!/usr/bin/env python class people: #类的基本属性 name = '' age = 0 #定义私有属性,私有属性在类外无法直接进行访问 __weight = 1 #定义构造方法 def __init__(self,name,age,weight): self.name=name self.age = age self.__weight=weight def speak(self): print('%s,%d.'%(self.name,self.age)) #类实例化 p = people('nosqldba',10,20) p.speak()输出:

[root@centos7 ~]# ./2.py nosqldba,10.

继承

派生类定义

class DerivedClassName(BaseClassName1): <statement1> ... <statementN>若是基类中有相同的方法名,而在子类使用时未指定,将从左至右搜索即方法在子类中未找到时,从左到右查找基类中是否包含方法 [root@centos7 ~]# vim 2.py #!/usr/bin/env python class people: #类的基本属性 name = '' age = 0 #定义私有属性,私有属性在类外无法直接进行访问 __weight = 1 #定义构造方法 def __init__(self,name,age,weight): self.name=name self.age = age self.__weight=weight def speak(self): print('%s,%d.'%(self.name,self.age)) #单继承 class student(people): grade = '' def __init__(self,name,age,weight,grade): #调用父类的构造函数 people.__init__(self,name,age,weight) self.grade = grade #覆盖父类的方法 def speak(self): print('%s,%d,%d.'%(self.name,self.age,self.grade)) #类实例化 s = student('nosqldba1',10,20,3) s.speak()结果:

[root@centos7 ~]# ./2.py nosqldba1,10,3.

多继承

语法

class DerivedClassName(Base1, Base2, Base3): <statement1> 。。。 <statementN>实例:

[root@centos7 ~]# vim 2.py self.__weight=weight def speak(self): print('%s,%d.'%(self.name,self.age)) #单继承 class student(people): grade = '' def __init__(self,name,age,weight,grade): #调用父类的构造函数 people.__init__(self,name,age,weight) self.grade = grade #覆盖父类的方法 def speak(self): print('%s,%d,%d.'%(self.name,self.age,self.grade)) #另一个类 class speaker(): topic = '' name = '' def __init__(self,name,topic): self.name=name self.topic=topic def speak(self): print('%s,%s'%(self.name,self.topic)) #多继承 class sample(speaker,student): a='' def __init__(self,name,age,weight,grade,topic): student.__init__(self,name,age,weight,grade) speaker.__init__(self,name,topic) test = sample('loge',20,50,5,'mysql') test.speak() #有多个方法,默认调用在括号中排靠前的父类方法结果

[root@centos7 ~]# ./2.py loge,mysql

方法重写

如果父类的方法不能满足需求,可以在子类中重写

[root@centos7 ~]# vim 1.py #!/usr/bin/env python class parent: def f1(self): print('调用父类') class child(parent): def f1(self): print('调用子类方法') c=child() #子类实例 c.f1() #子类调用重写方法输出

[root@centos7 ~]# ./1.py 调用子类方法

类属性方法

类的私有属性

__private_atttrs:类的私有属性以两个下划线开头,内部可以使用,类外部不能使用

类的方法

在内的内部使用defl定义一个类的方法,与一般的方法不同,雷方法必须包含参数self,并且为第一个参数

类的私有方法

__private_method:两个下划线开头,不能在类外部使用,只能在内部使用

实例

[root@centos7 ~]# vi 1.py #!/usr/bin/env python class parent: __secretage=0 #私有变量 publicname='' #公开变量 def f1(self): self.__secretage +=1 self.publicname='china' print(self.__secretage) p=parent() p.f1() print(p.publicname) print(p.__secretage)实现

[root@centos7 ~]# ./1.py 1 china Traceback (most recent call last): File "./1.py", line 16, in <module> print(p.__secretage) AttributeError: 'parent' object has no attribute '__secretage'同样类的私有方法不再举例

类的专有方法

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

运算符重载

[root@centos7 ~]# vi 1.py #!/usr/bin/env python class v: def __init__(self,a,b): self.a=a self.b=b def __str__(self): return 'v (%d,%d)' % (self.a,self.b) def __add__(self,o): return v(self.a+o.a,self.b+o.b) v1 = v(1,3) v2 = v(2,4) print(v1+v2)结果

[root@centos7 ~]# ./1.py v (3,7)

转载请注明原文地址: https://www.6miu.com/read-80110.html

最新回复(0)