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

【Python】类与对象(进阶)

程序员文章站 2024-03-16 10:28:22
...

本文为 Python 学习笔记,讲解类与对象(进阶)。欢迎在评论区与我交流????

封装

Python 中没有专门的关键字声明私有属性,若不希望该属性在类对象外部被访问,前面加 __

class Student:
    def __init__(self, name, age):
        self.name=name
        self.__age=age
    def show(self):
        print(self.name, self.__age)

stu=Student('张三', 20)
stu.show()
print(stu.name)
# print(stu.__age) # 报错

通过 print(dir(stu)) 查看所有属性:

【Python】类与对象(进阶)

可以看到 __age 被修改为了 _Student__age,因此可通过该属性名强行访问:

print(stu._Student__age)

继承

如果类没有继承任何类,默认继承 object

Python 支持多继承,即可以有多个父类

定义子类时,必须在构造函数中调用父类构造函数

【Python】类与对象(进阶)

demo:

class Person(object):
    def __init__(self, name, age):
        self.name=name
        self.age=age
    def info(self):
        print(self.name, self.age)

class Student(Person):
    def __init__(self, name, age, stu_no):
        super().__init__(name, age)
        self.stu_no=stu_no

class Teacher(Person):
    def __init__(self, name, age, teachofyear):
        super().__init__(name, age)
        self.teacherofyear=teachofyear

stu=Student('张三', 20, '1001')
teacher=Teacher('李四', 34, 10)

stu.info()
teacher.info()

多继承

【Python】类与对象(进阶)

demo:

class A(object):
    pass
class B(object):
    pass
class C(A, B):
    pass

方法重写

修改 Student 类,重写 info 方法。此时只能输出学号,无法输出 nameage

class Student(Person):
    def __init__(self, name, age, stu_no):
        super().__init__(name, age)
        self.stu_no=stu_no
    def info(self):
        print(self.stu_no)

要输出姓名和年龄,就要调用父类中被重写的方法:

class Student(Person):
    def __init__(self, name, age, stu_no):
        super().__init__(name, age)
        self.stu_no=stu_no
    def info(self):
        super().info()
        print(self.stu_no)

object 类

所有类都有 object 类的属性和方法,dir 查看对象的所有属性:

class Student:
    pass
stu=Student()
print(dir(stu))
print(stu)

输出结果:

【Python】类与对象(进阶)

直接输出对象的内存地址。

__str__() 方法返回对象描述:

class Student:
    def __init__(self, name, age):
        self.name=name
        self.age=age
    def __str__(self):
        return '我的名字是{0},今年{1}岁'.format(self.name, self.age)
stu=Student('张三', 20)
print(dir(stu))
print(stu)

重写后不再输出内存地址,而是默认调用 __str__() 方法

多态

class Animal(object):
    def eat(self):
        print('动物会吃')
class Dog(Animal):
    def eat(self):
        print('狗吃骨头')

class Cat(Animal):
    def eat(self):
        print('猫吃鱼')

class Person:
    def eat(self):
        print('人吃五谷杂粮')

# 定义函数
def fun(obj):
    obj.eat()

fun(Cat())
fun(Dog())
fun(Animal())
print('--------------')
fun(Person())

输出结果:

【Python】类与对象(进阶)

动态语言的多态不关心对象类型,只关心对象的行为。

特殊方法和特殊属性

持续更新。。。

有帮助的话点个赞加关注吧 ????