• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

关于python:图解python-面向对象编程

python 搞代码 3年前 (2022-02-25) 17次浏览 已收录 0个评论
文章目录[隐藏]

1.Python面向对象

面向对象编程,在英文中称之为Object Oriented Programming,简称OOP,是一种程序设计思维。OOP把对象作为程序的根本单元,一个对象蕴含了数据和操作数据的函数。

Python是一个纯天然面向对象的编程语言,在Python中,所有数据类型都能够视为对象。自定义的对象数据类型就是面向对象中的类(Class)的概念。

2.面向对象概念

  • 类(Class): 用来形容具备雷同的属性和办法的对象的汇合。它定义了该汇合中每个对象所共有的属性和办法。对象是类的实例。
  • 办法:类中定义的函数。
  • 类变量:类变量在整个实例化的对象中是专用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量应用。
  • 数据成员:类变量或者实例变量用于解决类及其实例对象的相干的数据。
  • 办法重写:如果从父类继承的办法不能满足子类的需要,能够对其进行改写,这个过程叫办法的笼罩(override),也称为办法的重写。
  • 局部变量:定义在办法中的变量,只作用于以后实例的类。
  • 实例变量:在类的申明中,属性是用变量来示意的,这种变量就称为实例变量,实例变量就是一个用 self 润饰的变量。
  • 继承:即一个派生类(derived class)继承基类(base class)的字段和办法。继承也容许把一个派生类的对象作为一个基类对象看待。例如,有这样一个设计:一个Dog类型的对象派生自Animal类,这是模仿”是一个(is-a)”关系(例图,Dog是一个Animal)。
  • 实例化:创立一个类的实例,类的具体对象。
  • 对象:通过类定义的数据结构实例。对象包含两个数据成员(类变量和实例变量)和办法。

相比其它编程语言,Python的类机制十分简洁,Python中的类提供了面向对象编程的所有基本功能

  • 类的继承机制容许多个基类
  • 派生类能够笼罩基类中的任何办法
  • 办法中能够调用基类中的同名办法

对象能够蕴含任意数量和类型的数据。

3.类定义

语法格局如下:

class ClassName:
    <statement-1>
    .
    .
    .
    <statement-N>

类实例化后,能够应用其属性,实际上,创立一个类之后,能够通过类名拜访其属性。

4.类对象

(1)属性援用和实例化

类对象反对两种操作:属性援用和实例化。

属性援用应用和Python中所有的属性援用一样的规范语法:obj.name

类对象创立后,类命名空间中所有的命名都是无效属性名。所以如果类定义是这样:

class NewClass:
    """一个简略的类实例"""
    num = 123456
    def f(self):
        return 'hello 搞代码python'
 
# 实例化类
x = NewClass()
 
# 拜访类的属性和办法
print("NewClass 类的属性 num 为:", x.num)
print("NewClass 类的办法 f 输入为:", x.f())

以上创立了一个新的类实例并将该对象赋给局部变量 x,x 为空的对象。

执行以上程序输入后果为:

NewClass 类的属性 num 为: 123456
NewClass 类的办法 f 输入为: hello 搞代码python

(2)构造函数

类有一个名为 __init__() 的非凡办法(构造方法/构造函数),该办法在类实例化时会主动调用,像上面这样:

def __init__(self):
    self.data = []

类定义了 __init__() 办法,类的实例化操作会主动调用 __init__() 办法。如下实例化类NewClass,对应的 __init__() 办法就会被调用:

x = NewClass()

当然, __init__() 办法能够有参数,参数通过 __init__() 传递到类的实例化操作上。例如(代码能够在在线python3环境中运行):

class MyComplex:
    def __init__(self, real_part, imag_part):
        self.r = real_part
        self.i = imag_part
x = MyComplex(5.0, -3.4)
print(x.r, x.i)   # 输入后果:5.0 -3.4

(3)self代表类的实例,而非类

类的办法与一般的函数只有一个特地的区别——它们必须有一个额定的第一个参数名称, 依照常规它的名称是 self。

class Test:
    def prt(self):
        print(self)
        print(self.__class__)
 
t = Test()
t.prt()

以上实例执行后果为:

<__main__.Test instance at 0x100724179>
__main__.Test

通过执行后果,能够看出,self代表的是类的实例(蕴含以后对象的地址信息),而self.class则指向类。

留神这里的self并不是python关键字,把他换成其余名称,比方showmeai,也是能够失常执行的(代码能够在在线python3环境中运行):

class Test:
    def prt(showmeai):
        print(showmeai)
        print(showmeai.__class__)
 
t = Test()
t.prt()

以上实例执行后果为:

<__main__.Test instance at 0x100724179>
__main__.Test

5.类的办法

在类的外部,咱们能够应用 def 关键字来定义类办法,类办法必须蕴含参数self, 且其为第一个参数,self代表的是类的实例。例如(代码能够在在线python3环境中运行)

class Person:
    #定义根本属性
    name = ''
    age = 0
    #定义公有属性,公有属性在类内部无奈间接进行拜访
    __weight = 0
    #定义构造方法
    def __init__(self,n,a,w):
        self.name = n
        self.age = a
        self.__weight = w
    def talk(self):
        print("%s的年龄是 %d 岁。" %(self.name,self.age))
 
# 实例化类
p = Person('搞代码python',30,30)
p.talk()

执行以上程序输入后果为:

搞代码python的年龄是 30 岁。

6.继承

Python 同样反对类的继承。派生类的定义如下所示:

class DerivedClass(BaseClass):
    <statement-1>
    .
    .
    .
    <statement-N>

子类(派生类/DerivedClass)会继承父类(基类/BaseClass)的属性和办法。

BaseClassName(实例中的基类名)必须与派生类定义在一个作用域内。除了类,还能够用表达式,基类定义在另一个模块中时这一点十分有用:

class DerivedClassName(modname.BaseClassName):
#类定义
class person:
    #定义根本属性
    name = ''
    age = 0
    #定义公有属性,公有属性在类内部无奈间接进行拜访
    __weight = 0
    #定义构造方法
    def __init__(self,n,a,w):
        self.name = n
        self.age = a
        self.__weight = w
    def talk(self):
        print("%s的年龄是 %d 岁。" %(self.name,self.age))
 
#单继承示例
class student(person):
    grade = ''
    def __init__(self,n,a,w,g):
        #调用父类的构函
        people.__init__(self,n,a,w)
        self.grade = g
    #覆写父类的办法
    def talk(self):
        print("%s的年龄是 %d 岁,目前在读 %d 年级"%(self.name,self.age,self.grade))
 
s = student('小Show',12,60,5)
s.talk()

执行以上程序输入后果为:

小Show的年龄是 12 岁,目前在读 5 年级

7.多继承

Python同样反对多继承模式。多继承的类定义形如下例:

class DerivedClassName(Base1, Base2, Base3):
    <statement-1>
    .
    .
    .
    <statement-N>

须要留神圆括号中父类的程序,若是父类中有雷同的办法名,而在子类应用时未指定,python从左至右搜寻 即办法在子类中未找到时,从左到右查找父类中是否蕴含办法。

#类定义
class person:
    #定义根本属性
    name = ''
    age = 0
    #定义公有属性,公有属性在类内部无奈间接进行拜访
    __weight = 0
    #定义构造方法
    def __init__(self,n,a,w):
        self.name = n
        self.age = a
        self.__weight = w
    def speak(self):
        print("%s的年龄是 %d 岁。" %(self.name,self.age))

#单继承示例
class student(person):
    grade = ''
    def __init__(self,n,a,w,g):
        #调用父类的构函
        people.__init__(self,n,a,w)
        self.grade = g
    #覆写父类的办法
    def talk(self):
        print("%s的年龄是 %d 岁,目前在读 %d 年级"%(self.name,self.age,self.grade))
 
#另一个类,多重继承之前的筹备
class speaker():
    topic = ''
    name = ''
    def __init__(self,n,t):
        self.name = n
        self.topic = t
    def talk(self):
        print("%s是一个演说家,明天ta演讲的主题是 %s"%(self.name,self.topic))
 
#多重继承
class sample(speaker,student):
    a =''
    def __init__(self,n,a,w,g,t):
        student.__init__(self,n,a,w,g)
        speaker.__init__(self,n,t)
 
test = sample("搞代码python",25,80,4,"Python")
test.talk()   #办法名同,默认调用的是在括号中排前地父类的办法

执行以上程序输入后果为:

搞代码python是一个演说家,明天ta演讲的主题是 Python

8.办法重写

如果你的父类办法的性能不能满足你的需要,你能够在子类重写你父类的办法,实例如下:

class Parent:        # 定义父类
   def my_method(self):
      print ('调用父类办法')
 
class Child(Parent): # 定义子类
   def my_method(self):
      print ('调用子类办法')
 
c = Child()          # 子类实例
c.my_method()         # 子类调用重写办法
super(Child,c).my_method() #用子类对象调用父类已被笼罩的办法

super()函数是用于调用父类(超类)的一个办法。

执行以上程序输入后果为:

调用子类办法
调用父类办法

9.类属性与办法

(1)类的公有属性

__private_attrs:由两个下划线结尾,申明为公有属性,不能在类的内部被应用或间接拜访。在类外部的办法中能够应用,应用办法为 self.__private_attrs

(2)类的办法

在类的外部定义的成员办法,必须蕴含参数 self,且为第一个参数,self 代表的是类的实例。

self 的名字并不是规定死的,也能够应用 this,但倡议还是依照约定应用 self

(3)类的公有办法

__private_method:由两个下划线结尾,申明为公有办法,只能在类的外部调用,应用办法为 self.__private_methods

类的公有属性示例代码如下:

class NewCounter:
    __secret_count = 0  # 公有变量
    public_count = 0    # 公开变量
 
    def count(self):
        self.__secret_count += 1
        self.public_count += 1
        print (self.__secret_count)
 
counter = NewCounter()
counter.count()
counter.count()
print (counter.public_count)
print (counter.__secret_count)  # 报错,实例不能拜访公有变量

执行以上程序输入后果为:

1
2
2
Traceback (most recent call last):
  File "test.py", line 16, in <module>
    print (counter.__secret_count)  # 报错,实例不能拜访公有变量
AttributeError: 'NewCounter' object has no attribute '__secret_count'

类的公有办法实例如下:

class WebSite:
    def __init__(self, name, url):
        self.name = name       # public
        self.__url = url   # private
 
    def who(self):
        print('name  : ', self.name)
        print('url : ', self.__url)
 
    def __foo(self):          # 公有办法
        print('这是公有办法')
 
    def foo(self):            # 公共办法
        print('这是公共办法')
        self.__foo()
 
x = WebSite('搞代码python常识社区', 'www.showmeai.tech')
x.who()        # 失常输入
x.foo()        # 失常输入
x.__foo()      # 报错

(4)类的专有办法:

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

(5)运算符重载

Python同样反对运算符重载,咱们能够对类的专有办法进行重载,实例如下:

class MyVector:
   def __init__(self, a, b):
      self.a = a
      self.b = b
 
   def __str__(self):
      return 'Vector (%d, %d)' % (self.a, self.b)
   
   def __add__(self,other):
      return Vector(self.a + other.a, self.b + other.b)
 
v1 = MyVector(2,10)
v2 = MyVector(5,-2)
print(v1 + v2)

以上代码执行后果如下所示:

Vector(7,8)

10.视频教程

请点击到B站查看【双语字幕】版本

https://www.bilibili.com/vide&#8230;

材料与代码下载

本教程系列的代码能够在搞代码python对应的github中下载,可本地python环境运行,能迷信上网的宝宝也能够间接借助google colab一键运行与交互操作学习哦!

本教程系列波及的Python速查表能够在以下地址下载获取:

  • Python速查表

拓展参考资料

  • Python教程—Python3文档
  • Python教程-廖雪峰的官方网站

搞代码python相干文章举荐

  • python介绍
  • python装置与环境配置
  • python根底语法
  • python根底数据类型
  • python运算符
  • python条件管制与if语句
  • python循环语句
  • python while循环
  • python for循环
  • python break语句
  • python continue语句
  • python pass语句
  • python字符串及操作
  • python列表
  • python元组
  • python字典
  • python汇合
  • python函数
  • python迭代器与生成器
  • python数据结构
  • python模块
  • python文件读写
  • python文件与目录操作
  • python谬误与异样解决
  • python面向对象编程
  • python命名空间与作用域
  • python工夫和日期

搞代码python系列教程举荐

  • 图解Python编程:从入门到精通系列教程
  • 图解数据分析:从入门到精通系列教程
  • 图解AI数学根底:从入门到精通系列教程
  • 图解大数据技术:从入门到精通系列教程

搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:关于python:图解python-面向对象编程

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址