首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >python基础复习:面向对象之继承

python基础复习:面向对象之继承

原创
作者头像
李福春
发布2025-07-30 10:06:26
发布2025-07-30 10:06:26
9200
代码可运行
举报
运行总次数:0
代码可运行

图中 是四代同堂,香火延续。

python中的继承是怎么定义和操作的呢?

1 可见性和属性装饰器

__name 表示私有 : 访问对象的私有属性 stu_Student__name ; 不能使用stu.__name访问私有属性

_name表示受保护: 相当于公有,不同包下面也是可以访问的。

代码语言:javascript
代码运行次数:0
运行
复制
class Teacher:
    def __init__(self, name, age):
        self.__name = name
        self._age = age

    def self_des(self):
        print(f"""我叫 {self.__name},今年 {self._age} 岁""")


t1 = Teacher("李四",30)
t2 = Teacher("王五",20)

t1.self_des()
t2.self_des()

# print(t1.__name) #报错 AttributeError: 'Teacher' object has no attribute '__name'
print(t2._age) #保护变量可以在本类中访问

print(t1._Teacher__name)
# print(t2._Teacher_age) #报错 

正常访问保护和私有属性:

不正常访问私有变量:

不正常访问保护变量:

2 动态属性

在运行时可以改变它的结构的语言。

允许

代码语言:javascript
代码运行次数:0
运行
复制
class Cat:
    def __init__(self, name,color):
        self.__name = name
        self.__color = color

    def show_self(self):
        print(f"""名字是 {self.__name},颜色是 {self.__color}""")



black_cat = Cat("小黑","黑色")
black_cat.show_self()

# 动态增加属性
black_cat.age = 10

print("age is : ",black_cat.age)

# 动态删除属性
# del black_cat.age

print("age is : ",black_cat.age)

禁止

代码语言:javascript
代码运行次数:0
运行
复制
class Dog:
    __slots__ = ("name", "age")
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def self_introduce(self):
        print(f"""我叫 {self.name},今年{self.age} 岁""")

    def run(self,speed):
        print(f"""我正在以{speed} m/s的速度向前跑""")


qg = Dog("忠犬七公", 8)
qg.self_introduce()


qg.sex = "公"

qg.self_introduce()

3 静态方法,类方法,对象属性

静态方法:发给类对象消息的方法。 @staticmethod 不要求第一个对象

类方法:发给类对象消息的方法。 @classmethod 第一个参数是类对象 clz

对象属性: 无参的方法也是属性。 @property

代码语言:javascript
代码运行次数:0
运行
复制
class Triangle:
    def __init__(self, a, b, c):
        self.a = a
        self.b = b
        self.c = c

    @property
    def perimeter(self):
        return self.a + self.b + self.c

    @property
    def area(self):
        p = self.perimeter / 2 #注意不是调用方法
        return (p * (p - self.a) * (p - self.b) * (p - self.c)) ** 0.5


t1 = Triangle(3, 4, 5)

print("t1.perimeter:", t1.perimeter)
print("t1.area:", t1.area)

代码语言:javascript
代码运行次数:0
运行
复制
class Triangle:
    def __init__(self, a, b, c):
        self.a = a
        self.b = b
        self.c = c

    def perimeter(self):
        return self.a + self.b + self.c

    def area(self):
        p = self.perimeter() / 2
        return (p * (p - self.a) * (p - self.b) * (p - self.c)) ** 0.5

    @staticmethod
    def is_valid(a, b, c):
        r = a + b > c and a + c > b and b + c > a
        print(f"""边长分别为{a}, {b}, {c}的三角形{'' if r else '不'}是合法的""")
        return r



Triangle.is_valid(1,2,10)
Triangle.is_valid(3,4,5)

代码语言:javascript
代码运行次数:0
运行
复制
class Triangle:
    def __init__(self, a, b, c):
        self.a = a
        self.b = b
        self.c = c

    def perimeter(self):
        return self.a + self.b + self.c

    def area(self):
        p = self.perimeter() / 2
        return (p * (p - self.a) * (p - self.b) * (p - self.c)) ** 0.5

    @classmethod
    def is_valid(cls,a, b, c):
        print(f"""cls is:  {cls} , cls type is  {type(cls)} """)
        r = a + b > c and a + c > b and b + c > a
        print(f"""边长分别为{a}, {b}, {c}的三角形{'' if r else '不'}是合法的""")
        return r


    
Triangle.is_valid(1,2,10)
Triangle.is_valid(3,4,5)

4 继承

继承:在已有的类上创建新类,减少重复代码的编写。 提供继承信息的类叫父类,超类,基类,得到继承信息的类叫子类,派生类,衍生类。

语法: class Son(Father):

如果没有指定父类,父类默认是object类

python允许多继承,一个子类可以有多个父类。

super函数可以调用父类的方法。

里氏替换: 子类对象替换父类对象

代码语言:javascript
代码运行次数:0
运行
复制
class People:
    def __init__(self,name,age):
        self.name = name
        self.age = age

    def eat(self):
        print(self.self_des()," 我吃东西")

    def sleep(self):
        print(self.self_des()," 我睡觉")

    def work(self):
        print(self.self_des()," 我工作")

    def play(self):
        print(self.self_des()," 我玩")

    def self_des(self):
        return f"""姓名:{self.name},年龄:{self.age} ,"""


class Student(People):
    def __init__(self,name,age,grade):
        super().__init__(name,age)
        self.grade = grade

    def study(self):
        print(super().self_des(),"my grade is :",self.grade," I am studying")


class Teacher(People):
    def __init__(self,name,age,gender):
        super().__init__(name,age)
        self.gender = gender

    def teach(self):
        print(super().self_des(), "性别:",self.gender,"I can teach")

student1 = Student("小明", 11, 5)

teacher1 = Teacher("张老师", 30, "男")


student1.study()

student1.eat()
student1.sleep()
student1.play()


teacher1.teach()

teacher1.eat()
teacher1.sleep()
teacher1.play()
teacher1.work()

5 小结

python是动态语言,可以动态添加属性,方法也是属性的一种,只不过该属性对应的是一个可以调用的方法。

面向对象的世界中,一切皆对象,类也是对象,也可以接收接收消息,通过类方法和静态方法。

通过继承,我们可以复用现有的类代码的能力,提高效率。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 可见性和属性装饰器
  • 2 动态属性
    • 允许
    • 禁止
  • 3 静态方法,类方法,对象属性
  • 4 继承
  • 5 小结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档