Python3面向对象

本文详细介绍了Python3的面向对象编程,包括面向对象的三大特性:封装、继承、多态,以及类的定义、实例化、属性、方法、特殊属性、继承、多继承、反射机制、单例模式和异常处理。特别强调了类的方法,如成员方法、私有方法、类方法、静态方法、属性方法的使用和区别。同时,文章还探讨了类的特殊方法,如`__init__`构造方法、`__del__`析构方法以及`__str__`等。此外,文章还涵盖了类的继承和多继承,以及多继承的MRO查找顺序。
摘要由CSDN通过智能技术生成

一、面向对象技术简介

1、面向对象简介

面向对象编程(Object Oriented Programing,OOP)是一种编程思想,OOP把对象当成程序的一个基本单元,一个对象包含数据和操作数据的方法。面向对象编程的三大特性如下:
A、封装,可以隐藏实现细节,使代码模块化。
B、继承,可以通过扩展已存在的类来实现代码重用,避免重复编写相同的代码。
C、多态,封装和继承的目的都是为了实现代码重用, 而多态是为了实现接口重用,使得类在继承和派生的时候能够保证任何一个类的实例都能正确调用约定好的属性和方法。
面向对象编程通过封装、继承、多态实现了软件工程的重用性、灵活性、扩展性三个目标。

2、面向对象术语

类(Class)是用来描述具有相同的属性和方法的对象的集合,定义了集合中每个对象所共有的属性和方法。
对象是类的实例,Python中对象包括两个数据成员(类变量和实例变量)和方法。
方法是类中定义的函数。
类变量在类的所有实例化对象中是公用的。类变量定义在类中且在函数体外。
方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行重写(override)。
继承是一个派生类(derived class)继承基类(base class)的字段和方法。继承允许把一个派生类的对象作为一个基类对象对待。
实例化:创建一个类的实例,类的具体对象。

3、对象的属性

在python当中一切皆对象,每个对象都有三个属性:id、类型type和数值。id是对象的地址,id相同则必为同一对象,不同对象的值可以相同。

在学习过程中有什么不懂得可以加我的
python学习交流扣扣qun,784758214
群里有不错的学习视频教程、开发工具与电子书籍。
与你分享python企业当下人才需求及怎么从零基础学习好python,和学习什么内容
# -*- coding:utf-8 -*-
x = 10
print(id(x))
print(type(x))  # <class 'int'>
print(x)

y = 10
print(id(y))
print(type(y))  # <class 'int'>
print(y)

print(x is y)  # True

二、类的定义

1、类的定义

类是一种抽象数据类型,是对现实世界的一类数据及其操作的封装。
类定义语法格式如下:

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

类实例化后,可以使用其属性,创建一个类后,可以通过类名访问其类属性。
Person类有以下3个属性:
nationality:国籍
name:姓名
id:×××号码

import uuid

class Person:
    nationality = "China"

    def __init__(self, name):
        self.name = name
        self.__id = str(uuid.uuid1())

    def hello(self):
        print("Hello, I am %s, I come from %s, My ID is %s" %(self.name, self.nationality, self.__id))

所有人的国籍基本都是相同的,且允许直接通过类或实例来访问,允许随意修改。
大部分人的姓名是不同的,且允许直接通过类的实例来访问和随意修改。
所有人的×××号码都是不一样的,且不允许直接通过类或实例来访问或随意修改。

2、类的实例化

import Person

bauer = Person.Person("Bauer")
bauer.hello()

3、类成员的可见性

Python中默认所有的成员都是公有成员,但私有成员是以两个下划线开头的名字表示私有成员,私有成员不允许直接访问,只能通过内部方法进行访问,私有成员也不允许被继承。
Python中通过在类变量、实例变量、类方法、实例方法前加__前缀,可以将其对外进行隐藏,变为类的私有变量或函数。由于Python中内置变量或函数使用__前后缀,因此,不推荐私有的变量或函数加__前后缀,只加__前缀。
Python作为动态语言,允许类或实例动态增加属性,与类内部的私有的属性并不相同。
Python类维护了一个用于保存类的数据的字典,字典内部Python将私有成员改名为_ClassName + __variable_name,因此在类外通过访问私有变量新的名称可以访问相应的私有变量。

在学习过程中有什么不懂得可以加我的
python学习交流扣扣qun,784758214
群里有不错的学习视频教程、开发工具与电子书籍。
与你分享python企业当下人才需求及怎么从零基础学习好python,和学习什么内容
import uuid

class Person(object):
    nationality = "China"

    def __init__(self, name):
        self.name = name
        self.__id = str(uuid.uuid1())

    def hello(self):
        print("Hello, I am %s, I come from %s, My ID is %s" %(self.name, self.nationality, self.__id))

if __name__ == "__main__":
    bauer = Person("Bauer")
    print(bauer.__dict__)
    print(bauer._Person__id)

"""
output:
{'name': 'Bauer', '_Person__id': 'ed496846-94c7-11e9-80c4-5ce0c5e8bcf0'}
ed496846-94c7-11e9-80c4-5ce0c5e8bcf0
"""

三、类的属性

1、类属性

直接定义在class下的属性是公有属性/类属性,类属性是类的所有实例对象共同所有的,因此默认情况下类属性值只会保留一份,而不会为类的每个实例都保存一份。
类属性可以使用ClassName.VariableName访问,在实例方法内部也可以使用self.__class__.VariableName进行访问。

import uuid

class Person(object):
    nationality = "China"

    def __init__(self, name):
        self.name = name
        self.__id = str(uuid.uuid1())

    def hello(self):
        print("Hello, I am %s, I come from %s, My ID is %s" %(self.name, self.nationality, self.__id))

    def sayHello(self):
        print("Hello,I come from %s" % self.__class__.nationality)

if __name__ == "__main__":
    bauer = Person("Bauer")
    bauer.sayHello()
    jack = Person("Jack")
    print(Person.nationality, bauer.nationality, jack.nationality)
    bauer.nationality = "USA"
    print(Person.nationality, bauer.nationality, jack.nationality)
    Person.nationality = "Germany"
    print(Person.nationality, bauer.nationality, jack.nationality)

"""
output:
Hello,I come from China
China China China
China USA China
Germany USA Germany
"""

类属性可以通过类直接访问,也可以直接通过实例进行访问; 如果通过类的某个实例对类属性进行修改,本质上是为该实例添加了一个与类属性名称相同的实例属性,对真正的类属性没有影响,因此不会影响其它实例获取类属性的值; 通过类对类属性进行修改,必然会改变类属性的值,对类的所有实例是都有影响的。

2、实例属性

实例属性又称成员属性或成员变量,是类的每个实例对象单独持有的属性。实例属性必须在类的init方法中进行声明。

在学习过程中有什么不懂得可以加我的
python学习交流扣扣qun,784758214
群里有不错的学习视频教程、开发工具与电子书籍。
与你分享python企业当下人才需求及怎么从零基础学习好python,和学习什么内容
import uuid

class Person(object):
    nationality = "China"

    def __init__(self, name):
        self.name = name
        self.__id = str(uuid.uuid1())

    def hello(self):
        print("Hello, I am %s, I come from %s, My ID is %s" %(self.name, self.nationality, self.__id))

if __name__ == "__main__":
    bauer = Person("Bauer")
    jack = Person("Jack")
    print(bauer.name, jack.name)
    bauer.name = "Jack Bauer"
    jack.name = "Chen Jack"
    print(bauer.name, jack.name)
    #print(Person.name)  ## AttributeError: type object 'Person' has no attribute 'name'

"""
output:
Bauer Jack
Jack Bauer Chen Jack
"""

通过类访问成员属性会报错:
print(Person.name)
实例属性可以直接通过实例对象来访问和更改,是每个实例对象独有的,某个实例对象的实例属性被更改不会影响其它实例对象的相同属性的值。实例属性的值不能通过类来访问和修改。
Python作为动态语言,可以在类外部动态增加实例对象的属性。

3、私有属性

私有属性和实例属性必须在__init__方法中进行声明,但私有属性的属性名需要以双下划线__开头,比如Person中的__id属性。私有属性是一种特殊的实例属性,只允许在实例对象的内部(成员方法或私有方法中)访问,而不允许在实例对象的外部通过实例对象或类来直接访问,也不能被子类继承。

import uuid

class Person(object):
    nationality = "China"

    def __init__(self, name):
        self.name = name
        self.__id = str(uuid.uuid1())

    def hello(self):
        print("Hello, I am %s, I come from %s, My ID is %s" %(self.name, self.nationality, self.__id))

if __name__ == "__main__":
    bauer = Person("Bauer")
    bauer.hello()
    # print(bauer.__id) # AttributeError: 'Person' object has no attribute '__id'
    # print(Person.__id) # AttributeError: type object 'Person' has no attribute '__id'

"""
output:
Hello, I am Bauer, I come from China, My I
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值