欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

荐 21 Python - 面对对象 基础 下

程序员文章站 2022-04-19 14:10:17
Python 面对对象 基础 下文章目录Python 面对对象 基础 下一.继承二.运算符重载三.单例模式一.继承1.什么是继承?​让子类直接拥有父类的属性和方法的过程就是继承​父类 - 被继承者(在其他语言里也有的叫做超类)​子类 - 继承者2.怎么继承?语法:class 类名(父类1,父类2....)类的说明文档 类的内容注意:默认情况下,定义的类继承自object下面写段简单的代码看看继承的实现:class Person: num = 61...

Python 面对对象 基础 下

一.继承

1.什么是继承?

​ 让子类直接拥有父类的属性和方法的过程就是继承

​ 父类 - 被继承者(在其他语言里也有的叫做超类)

​ 子类 - 继承者

2.怎么继承?

语法:
class 类名(父类1,父类2....)
	类的说明文档
    类的内容
注意:默认情况下,定义的类继承自object

下面写段简单的代码看看继承的实现:

class Person:
    num = 61

    def __init__(self):
        print('Person中init')
        self.name = '小明'
        self.age = 18
        self.gender = '男'
        self.__sex = '女'

    def eat(self):
        print(f'Person:{self.name}在吃饭')

    @classmethod
    def show_num(cls):
        print(f'人类的数量:{cls.num}')

    @staticmethod
    def func1():
        print('人类破坏环境!')

# 让 Student(子类) 继承 Person(父类)
class Student(Person):
    pass

# 继承的时候子类可以直接拥有父类所有的属性和方法
print(Student.num) 	# 用子类获取到父类的类属性  61
stu = Student()	  	
print(stu.name, stu.age, stu.gender)  # 小明 18 男  子类的对象拥有父类的属性
stu.eat()			# 子类的对象调用父类方法
Student.show_num()	# 子类调用父类方法
Student.func1()		# 子类调用父类的静态方法
print(stu.__dict__)	# {'name': '小明', 'age': 18, 'gender': '男', '_Person__sex': '女'}   这里私有属性一样会继承

3.在子类中添加内容

①在子类中添加类属性和方法

类属性和方法的添加不会因为继承而受到影响

②添加对象属性

对象属性是怎么被继承:继承的时候因为init方法被继承,间接继承了对象属性

在子类的__init__方法中通过 super()去调用父类的__init__方法

补充:类中的方法的调用过程(重要)

通过类或者对象在调用方法的时候,会先看当前类中有没有这个方法,如果有就直接调用自己类中的方法;没有就看父类中有没有定义这个方法,如果父类定义了就调用父类的;父类没有定义,就看父类的父类中有没有定义…以此类推,如果 object 中没有定义才会报错!

二.运算符重载

运算符重载

python中使用每一个运算符其本质都是在调用运算符对应的方法(每个运算符都会对应一个固定的方法)。某种类型的数据支不支持某个运算符,就看这个数据对应的类型中有没有实现运算符对应的方法,下面举例看一下实现python实现运算的方法

10+20  		# 其实就是调用  10.__add__(20)
'abc'+'123' #  'abc'.__add__('123')
100-10      # 100.__sub__(10)

下面写段简单的代码来实现一些简单的功能

from copy import copy
class Person:
    def __init__(self, name='', age=0):
        self.name = name
        self.age = age

    # +
    def __add__(self, other):
        # self + other
        return self.age + other.age   # 这里重写了__add__方法,使我们在调用对象相加时,返回值是年龄相加的值,否则对象跟对象之间是不能做加减乘除的

    # *
    def __mul__(self, other):
        list1 = []
        for _ in range(other):
            list1.append(copy(self))
        return list1     # 重写了__mul__方法

    # <
    # 注意:大于符号和小于符号实现其中一个另外一个也可以用
    def __lt__(self, other):
        return self.age < other.age   # 重写了小于__lt__方法,我们在用sort排序时,会比较对象的年龄来排序,否则也会报错

    def __repr__(self):
        return f'<{str(self.__dict__)[1:-1]}>'

p1 = Person('小明', age=18)
p2 = Person(age=30)

print(p1 + p2)    # p1.__add__(p2)

print(p1 * 3)    # [<'name': '小明', 'age': 18>, <'name': '小明', 'age': 18>, <'name': '小明', 'age': 18>]

persons = [Person('小花', 20), Person('Tom', 18), Person('张三', 28), Person('李四', 15)]
persons.sort()
print(persons)    # [<'name': '李四', 'age': 15>, <'name': 'Tom', 'age': 18>, <'name': '小花', 'age': 20>, <'name': '张三', 'age': 28>]

三.单例模式

单例模式即一个类有且仅有一个实例,在python中,一个类创建对象实例是通过调用父类object__new__(cls)方法来创建对象的。我们可以通过重写__new__(cls)方法去实现单例模式。

class Person:
    __obj = None  # 定义一个类属性做判断

    def __new__(cls, *args, **kwargs):
        if not cls.__obj: # 如果_obj为空证明是第一次创建的实例
            cls.__obj = super().__new__(cls) # 通过父类创建实例
        return cls.__obj # 返回类属性,保证下一次再调用时,_obj就不为空了

    def __init__(self):
        print('init:', self)
p1 = Person()
p2 = Person()
print(p1 is p2)  # True

本文地址:https://blog.csdn.net/plyzz/article/details/107187533