IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> python与面向对象 -> 正文阅读

[Python知识库]python与面向对象

Python 从设计之初就已经是一门面向对象的语言了,正因为如此,在Python中创建一个类和对象是很容易的。

1、? 介绍:

简单的了解一些面向对象的基本特征:

? 类(Class):用来描述具有相同属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象就是类的实例。

? 类变量:类变量在整个实例化的对象中是公用的,类变量定义在类中且在函数体之外,通常不作为实例变量使用。

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

? 方法重写:如果从父类继承 的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(Override),已称为方法的重写。

? 实例变量 :定义在方法中的变量,只作用于当前实例的类。

? 继承:指一个派生类(Derived Class)继承基类(Base Class)的字段和方法,继承也允许把一个派生类的对象作为一个基类对象对待。例如:有这样的一个设计,一个Dog雷响的对象派生自Animal类,这是模拟“是一个(is-a)”的关系、

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

? 方法:类中定义的函数。

? 对象:通过类定义的数据结构实例,对象包括俩个数据成员(类变量和实例变量)和方法。

2、 定义语法:

? ?类必须在定义后才能被是哟个。定义一个类也就是定义这一类对象的模板,定义它的属性和方法。Python 中提供Class关键字来声明一个类,class中有成员属性和成员方法。Python中类的定义格式:

class [类名]:

? ? [语法块]

? ? ?注意:类名和变量名一样区分大小写。字母相同但是大小写不同的类会被解释器视为两个不同的类。

? 定义一个类:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

class EmptyClass:
    pass

? ? ? 在这个例子中 我们定义了一个空的类,虽然 什么都没有做,但是不影响它的存在。

类的使用

? ?在使用类之前需要实例化类,类实例化后会成为常见对象。创建对象和创建变量类似,需要先声明对象是那个类,同时指明变量名称。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

class EmptyClass:
    pass

empty = EmptyClass()
print(type(empty))

? ?执行结果:

<class '__main__.EmptyClass'>

? 这个例子,创建一个EmptyClass 对象,变量名字是empty,同时在内存中为这个对象分配了内存空间。

3、? 类的构造方法

? ?在创建实例时,很多类可能都需要有特定的初始状态,所以,一个类可以定义一个特殊的方法,叫做构造函数,在Python中,构造函数就是类的__init__? 方法,(init前后都有两个连续的短下划线)。

? ?定义和使用构造函数

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

class Dog:
    def __init__(self):
        print ("汪汪汪!")

dog = Dog()

? ?执行结果:

汪汪汪!

? ?当一个类定义了__init__方法,类在实例化时会自动调用__init__方法,用于创建新的类实例 。在这个例子中,新的实例备创建,同时执行了构造方法,运行了 print函数,注意:构造函数的第一个参数时”self“ ,不能漏掉

? ?还有一点需要注意的是,构造方法的返回值必须是”None“。在定义构造方法的时候解释器不会报错,但是在实例化的狮虎Python会输出错误提示:”TypeError:__init_() should return None“.

4、类的属性

? 在构造方法中我们可以初始化一些属性,例如:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

class Dog:
    def __init__(self, name):
        self.name = name
        self.age = 3


dog = Dog("旺财")

print (dog.name)
print (dog.age)

? 执行结果:

旺财
3

? ? 注意:属性(或者叫成员变量、类变量)必须要使用”self“ 加上点的方式赋值,不能直接定义变量,直接定义的变量的生命周期指挥在函数内,函数执行完成变量完成就会被销毁,例如:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

class Dog:
    def __init__(self, name):
        self.name = name
        age = 3


dog = Dog("旺财")

print (dog.name)
print (dog.age)

? ?执行结果:

旺财
Traceback (most recent call last):
? File "D:/python/PyCharm 2021.1.2/mysql_cnf.py", line 13, in <module>
? ? print (dog.age)
AttributeError: 'Dog' object has no attribute 'age'

? ? 执行这个例子,Python解释器将会提示我们:”Attribute Error:‘Dog’ object has no attribute 'age' ",即”Dog“ 对象没有”age“ 这个属性,其实函数__init__的第一个参数”self“ 指的就是实例本身,在C++等语言中对应的就是” this“ 指针,可以理解为对实例的属性进行赋值,Python在调用__init__ 函数的时候会自动地添加实例作为函数的第一个参数

5、类中的方法

? 在类中定义的函数我们成为方法,其实在前面的章节中我们已经多次调用方法了,例如dict字典中的keys方法就是成员方法,自己定义成员方法也很简单,例如:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

class Dog:
    def __init__(self, name):
        self.name = name

    def play(self):
        print ("汪汪汪! 我是", self.name)

dog = Dog("旺财")
dog.play()
print (dog.name)

执行结果:

汪汪汪! 我是 旺财
旺财

? ?从这个例子可以看出,类中的方法和函数定义的方法基本相同,除了方法一定要定义在类里面并且第一个参数必须是”self“(参数名字不强制要求为”self“,但是一般使用名字”self“以与其他参数做区分),其他和函数定义的方法没有任何区别。

6、私有属性

? 从前面的例子可以看到,在构造函数中定义了 属性,实例可以轻松地获取和修改属性的值。但是有时候我们需要限制实例随意修改属性,这时候就要用到私有属性,定义私有属性很简单,只要在定义属性名字的时候使用两条下划线作为开头,Python解释器就认为i这个属性是私有的,外部不能随便访问这个属性,例如:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
class Dog:
    def __init__(self, name):
        self.__name = name


    def play(self):
        print ("汪汪汪! 我是", self.__name)

dog = Dog("旺财")
dog.play()

#错误
print (dog.__name)

? ?执行结果:

汪汪汪! 我是 旺财
Traceback (most recent call last):
? File "D:/python/PyCharm 2021.1.2/mysql_cnf.py", line 15, in <module>
? ? print (dog.__name)
AttributeError: 'Dog' object has no attribute '__name'

? ? 执行这段代码,Python解释器会输出一段错误提示,”Attribute Error:‘Dog’ object has no attribute '__name' “。虽然我们在构造方法中给”__name“? 赋值了,但是在实例中并不能直接访问到”__name“ 这个以两条下划线开头的成员变量,在平时的实际项目中,我们可以使用这个特性保护一些让用户随便修改的属性,例如:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

class Dog:
    def __init__(self, name):
        self.__name = name
        self.__age = None
        print (self.__name, "生成成功")

    def  set_age(self, age):
        if not isinstance(age, int):
            print ("输入的年龄必须是数字!")
            return False
        if age <= 0:
            print ("年龄必须大于0!")
            return False
        self.__age = age

    def play(self):
        print ("汪汪汪! 我今年", self.__age )

dog = Dog("jerry")
dog.set_age("hello")
dog.set_age(-20)
dog.set_age(5)
dog.play()

? ?执行结果:

jerry 生成成功
输入的年龄必须是数字!
年龄必须大于0!
汪汪汪! 我今年 5

? ? 在这个例子中,”__age“ 是私有属性,实例化后只能通过set_age方法设置年龄,在set_age方法中,我们限制了”age“ 只能是”int“ 并且其值要大于”0“,有效地限制了实例化后 数的内容,保证了”__age“? 是一个有效可用的数据。

7、私有方法

? ?上述讲到私有属性,即只能在类内部被操作的属性,同样的,方法也有私有方法,和私有属性一样,私有方法只能在类内部被调用,例如:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

class Dog:
    def __say(self, name):
        print (name)

    def play(self):
        self.__say("汪汪汪")

dog = Dog()

dog.play()

#错误
# dog.__say()

? ?执行这段代码,可以发现play 方法可以正常运行,但是__say 方法不能直接被实例”dog“调用,Python解释器会提示错误信息,”AttributeError:‘dog’object has no attribute ‘__say’ ”.

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-11-26 08:49:10  更:2021-11-26 08:51:30 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 2:15:58-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码