Python之继承、封装

# pass 空语句,为了保持程序结构的完整性
# 经典类
class A:
    pass

class A():
    pass

# object 是python中为所有对象提供的顶级父类
class A(object):
    pass

# 1、继承
# 继承可以使子类具有父类的所有属性和方法
# 继承分为单继承和多继承
# 单继承的语法:
# class 类名(父类名):
#     	pass
# 1、定义动物类,方法:吃饭和睡觉
class Animal(object):  # 动物类--》父类
    def __init__(self, name):
        self.name = name  # 实例属性

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

    def sleep(self):
        print(f'{self.name}在睡觉')

# 2、定义一个狗类,继承动物类
class Dog(Animal):
    pass  # 占位符,代码里面类下面不写东西,会自动跳过

# 3、通过狗类创建对象,通过对象去调用方法
dog = Dog('修勾')
dog.eat()
dog.sleep()

# 总结:子类可以继承父类的所有属性和方法,就算自己没有,也可以使用父类的

# 继承的传递性:子类拥有父类以及父类的父类中的属性和方法
class GrandFather(object): # 父类的父类
    def eat(self):
        print('吃饭')

    def sleep(self):
        print('睡觉')

class Father(GrandFather): # 父类
    def study(self):
        print('学习')

class Son(Father): # 子类
    pass

son = Son()
son.eat()
son.sleep()
son.study()

# 多继承定义格式:
# 	class 类名 (父类名1,父类名2,...)
# 		pass

# 多继承让子类同时拥有多个父类的属性和方法

class Father1(object):
    def money(self):
        print('继承财产')

class Mother1(object):
    def beautiful(self):
        print('继承样貌')

class Son1(Father1, Mother1):
    pass

son1 = Son1()
son1.money()
son1.beautiful()


# 不同的父类存在同名的方法
class Father2(object):
    def height(self):
        print('身高一米八')

class Mother2(object):
    def height(self):
        print('身高一米六')

class Son2(Father2, Mother2):  # 子类---谁先继承就用谁(就近原则)
    def height(self):
        print('身高一米七')

son2 = Son2()
son2.height()


# python中内置属性__mro__可以查看方法搜索顺序
# 类名.__mro__
print(Son2.__mro__)



# 重写
# 1、覆盖 父类的方法:在子类中定义一个跟父类同名的方法,会子类的重写方法
class Person(object):
    def work(self):
        print('厨师,做饭很好吃')

class Son3(Person):
    def work(self):
        print('老师,教书育人')

son3 = Son3()
son3.work()



# 对父类方法进行扩展:继承父类的方法,子类可以添加自己的功能
# 实现方式有三种:
# ①父类名.方法名(self)
# ②super().方法名()  推荐使用
# ③super(子类名,self).方法名()
class Person6(object):
    def work(self):
        print('厨师,做饭很好吃')

    def eat(self):
        print('干饭人干饭魂')

class Son6(Person6):
    def work(self):

        # ①父类名.方法名(self)
        Person6.work(self)

        # ②super().方法名()
        super().work()
        super().eat()

        # ③super(子类名,self).方法名
        super(Son6, self).work()
        print('老师,教书育人')

son6 = Son6()
son6.work()



# 封装指的是隐藏对象中一些不希望被外部所访问到的属性和方法
# 类,本身就是一种封装

# 类中定义私有属性,只能在类的内部使用,外部无法访问
# 方法:在属性名和方法名前面加上两个下划线__。

class Person7(object):
    sex = '男'
    __age = 30  # 私有属性

    def funa(self):
        print('在实例方法中访问类属性:', self.sex)
        print('在实例方法中访问私有属性:', self.__age)
class Son7(Person7):
    pass

son7 = Son7()
print(son7.sex)
# print(son7.age)  # 报错,Son对象里面没有age属性

# 第一种:
# 私有属性:外部不能访问到
son7.funa()

# 第二种:了解  语法:对象名._类名__私有属性
print(son7._Person7__age)



# 私有方法
class Person8(object):
    sex = '男'
    __age = 30  # 私有属性

    def __sing(self):
        print('爱唱歌')

    def funa(self):
        print('在实例方法中访问类属性:', self.sex)
        print('在实例方法中访问私有属性:', self.__age)
        # 在实例方法中调用私有方法
        # Person8.__sing(self)
        self.__sing()
        
class Son8(Person8):
    pass

son = Son8()
# son.sing()  # 报错
# son.__sing()  # 报错
son.funa()
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值