ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Python基础第十三节—面向对象(中)

2021-03-31 11:00:12  阅读:181  来源: 互联网

标签:__ 第十三 Python self 面向对象 父类 方法 age 属性


文章目录

一、封装

封装是面向对象的三大特性之一,为了安全简化的编程,我们将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体(即类);封装的目的是增强安全性和简化编程,使用者不必了解具体的实现细节,而只是要通过外部接口,一特定的访问权限来使用类的成员。
封装可以为属性和方法添加私有权限,使外界无法访问这个属性或方法,但这不是绝对的,就像外挂一样,我们能只能做到防止但做不到杜绝,所以私有属性或方法只是防君子但不防小人,私有属性(方法)在类外部无法使用,但可以在内部使用

# 在类中,在属性或方法的前面加上两个下划线,就称为私有属性(方法)
class Student:

    # 初始化参数
    def __init__(self, name):
        self.name = name
        self.__age = 18  # 在需要设置的属性或方法前加双下划线,即设置私有属性或私有方法

    def display(self):
        print('%s的年龄是%d' % (self.name, self.__age))


s = Student('李四')

# 此时age属性为私有属性,不能进行外部访问,否则会报错
#print(s.__age)

# 以单下划线+类名的显示,可以访问私有属性,在pycharm中可以看到这里有黄标,提示这里是不希望访问的
print(s._Student__age)
输出:18

# 使用__dict__查看类中的所有属性
print(s.__dict__)
输出:{'name': '李四', '_Student__age': 18}

s.display()
输出:李四的年龄是18

二、property装饰器

property装饰器把方法包装成属性,让方法可以以属性的形式被访问和调用。

  • 被 @property 装饰的方法是获取属性值的方法,被装饰方法的名字会被用做 属性名。
  • 被 @属性名.setter 装饰的方法是设置属性值的方法。
  • 被 @属性名.deleter 装饰的方法是删除属性值的方法。
class Student(object):
    def __init__(self):
        # 私有属性
        self.__age = 0

    @property  # 当对象调用age属性的时候就会执行下面的方法
    def age(self):
        print('获取属性')
        return self.__age

    @age.setter  # 当对象调用age属性设置值的时候会自动调用下面的方法
    def age(self, new_age):
        print('设置属性')
        if new_age >= 0 and new_age <= 130:
            self.__age = new_age
        else:
            print("超出基础值")

    @age.deleter
    def age(self):
        print(self.__age)
        del self.__age  # 前后打印,验证删除是否成功
        print(self.__age)


# 提示:使用装饰器方式的proprey属性那么方法名要保持一致

student = Student()
age = student.age
print(age)

student.age = 20  # 修改age的值,自动调用@age.setter

age = student.age
print(age)

del student.age

三、继承

继承是面向对象三大特性之一
通过继承我们可以使一个类获取到其他类中的属性和方法
在定义类时,可以在类名后面的括号中指定当前类的父类(超类、基类)
继承提高了类的复用性。让类与类之间产生了关系。有了这个关系,才有了多态的特性

四、方法重写

如果在子类中有和父类同名的方法,则通过子类实例去调用方法时,会调用子类的方法而不是父类的方法,这个特点我们称之为方法的重写(覆盖)
当我们调用一个对象的方法时:

  • 会优先去当前对象中寻找是否具有该方法,如果有则直接调用
  • 如果没有,则去当前对象的父类中寻找,如果父类中有则直接调用父类中的方法
  • 如果没有,则去父类中的父类寻找,以此类推,直到找到object,如果依然没有找到就报错了

方法重写的简单理解就是,王思聪从父亲王建林身上继承了他所有的东西,王建林所能做的他都能做,但在企业上,王思聪想做电竞,所以对王建林的万达改成了电竞,这种与父类方法重名,但执行效果不同的方法就叫方法重写。

class Father(object):
    def enterprise(self):
        print('房地产')

class Son(Father):
    def enterprise(self):
        print('电竞')


a = Son()
a.enterprise()
输出:电竞

五、super()

在类的继承中,如果重定义某个方法,该方法会覆盖父类的同名方法,但有时,我们希望能同时实现父类的功能,这时,我们就需要调用父类的方法了,可通过使用 super 来实现,比如:

class Animal(object):

    def __init__(self, name):
        self.name = name

    def greet(self):
        print('我是%s' % self.name)


class Dog(Animal):
    def greet(self):
        super().greet()
        print('旺旺')

d = Dog('旺财')
d.greet()
输出:我是旺财
	  旺旺

super()方法多用于方法重写,当你不需要对父类方法完全重写,只是对改方法进行扩展,或者需要使用父类方法中的属性和方法是就可以进过super()进行调用

六、多重继承

Python支持多重继承,也就是一个儿子可以用有多个父亲,使用方法就是在类名后面的括号类添加需要继承的父类名,并用逗号隔开、

  • 当父类方法中存在同名的方法是,会首先从括号中的父类从左右查找
  • 如果父类又有各自的父类的话,将遵从深度优先,也就是从继承的第一个父类一直查找到底,在从第二个父类中找
  • 如果继承的父类又继承同一个父类时,将先在父类中进行查找,再去父类的父类中去查找

标签:__,第十三,Python,self,面向对象,父类,方法,age,属性
来源: https://blog.csdn.net/qq_54010706/article/details/115336401

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有