Python学习笔记--基础语法6.2--魔法方法的介绍与使用(私有方法、属性以及继承)

私有属性和方法:
对象里面有的方法不希望在对象的外部被访问,只在对象内部使用
定义方式:
在定义属性和方法时,在属性名或者方法名前面增加两个下划线,就代表定义的是私有的属性或方法。
例如:

class women:
    def __init__:
        self.__name = name 
        self.__age  = 18
        
        
    def women_info(self):
        print('我的名字是{},我的年龄是{}'.format(self.__name,self.__age))
        
liuguixiang  = women('刘桂香')
print(liuguixiang.age)
liuguixiang.women_info()

结果:

Exited with error status 1
  File "07e8cfd7ef4fcdb35d80f8e074ae2490", line 44
    def __init__:
                ^
SyntaxError: invalid syntax

姓名和年龄这两个属性,是私有属性。不能被外部调用。

继承:
1.单继承 2.多继承
面向对象的三大特征:
1.封装:根据职责降属性和方法封装到一个抽象的类中
2.继承:实现代码的重用,相同的代码不需要重复去编写
3.多态:不同的对象调用相同的方法,产生不同的执行结果,增加代码灵活度。

继承的概念:
子类拥有父类所有的属性和方法。
继承是有传递性的。

class Animal():
    """父类也叫做基类"""
    def __init__(self):
        self.name = 'nunu'
    def run(self):
        print('%s会跑'%self.name)
        
class Dog(Animal):
    '子类也叫做派生类'
    pass

dog = Dog()
print(dog.name)
dog.run()

结果:

nunu
nunu会跑

Dog是一个子类他继承了父类Animal的属性。
如果在创建一个子类,这个子类继承Dog类会发生什么情况?

# -*- coding: utf-8 -*-
class Animal():
    """父类也叫做基类"""
    def __init__(self,name):
        self.name = name
    def run(self):
        print('%s会跑'%self.name)
        
class Dog(Animal):
    '子类也叫做派生类'
    def eat(self):
        print('吃东西')
class Jm(Dog):
    pass

dog = Dog('狗')
print(dog.name)
dog.run()
print('*'*50)
jm=Jm('金毛')
jm.run()
jm.eat()
print(jm.name)

结果:

狗
狗会跑
**************************************************
金毛会跑
吃东西
金毛

会发现,Jm这个类继承了Dog类继承的属性和方法以及Dog类里的方法。
如果Dog类里面有与他的父类Animal相同的方法,那么Jm类在执行时又会产生什么样的效果呢?

# -*- coding: utf-8 -*-
class Animal():
    """父类也叫做基类"""
    def __init__(self,name):
        self.name = name
    def run(self):
        print('%s会跑'%self.name)
        
class Dog(Animal):
    '子类也叫做派生类'
    def run(self):
        print('我是Dog类的run方法')
        
class Jm(Dog):
    pass

dog = Dog('狗')
dog.run()
print('*'*50)
jm=Jm('金毛')
jm.run()

结果:

我是Dog类的run方法
**************************************************
我是Dog类的run方法

如果在子类里面已经定义了父类中已经定义的方法,那么会重写父类的方法。(可以理解为覆盖了父类的方法)
父类的私有属性会被继承吗?

class Animal():
    """父类也叫做基类"""
    def __init__(self,name):
        self.__name = name
    def run(self):
        print('%s会跑'%self.__name)
        
class Dog(Animal):
    '子类也叫做派生类'
    def run(self):
        print('我是Dog类的run方法')
        
class Jm(Dog):
    pass

dog = Dog('狗')
print(dog.name)
dog.run()

结果:

Exited with error status 1
Traceback (most recent call last):
  File "bcdbd05f15c81f0eb183eaf97b4ac91e", line 22, in <module>
    print(dog.name)
AttributeError: 'Dog' object has no attribute 'name'

父类的私有属性不会被继承。
如何在重写了父类方法的同时,既能访问父类方法,又能访问子类的方法呢?
super():常使用于重写父类方法时,并且也要同时调用父类中封装的同一个方法。

class Animal():
    """父类也叫做基类"""
    def __init__(self,name):
        self.name = name
    def run(self):
        print('%s会跑'%self.name)
        print('我是Animal类的run方法')
        
class Dog(Animal):
    '子类也叫做派生类'
    def run(self):
        print('我是Dog类的run方法')
        super().run()
class Jm(Dog):
    pass

dog = Dog('狗')
print(dog.name)
dog.run()

结果:

狗
我是Dog类的run方法
狗会跑
我是Animal类的run方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值