前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >详解Python类与对象(下)

详解Python类与对象(下)

作者头像
罗罗攀
发布2021-07-16 11:50:21
2270
发布2021-07-16 11:50:21
举报

前言

上节课我们介绍了Python面向对象的基本概念和使用,本节课将继续讲解Python面向对象,主要分为两个部分,第一个是继承,第二个是私有化。

希望这两次分享能让初学者能够基本了解Python面向对象编程,并按实际需求编写出自己定义的类。

继承

继承是每个人的梦想。

继承的写法很简单,只需要在定义子类时,指定父类即可。

代码语言:javascript
复制
class Animal:

    leg = 4

    def __init__(self, species, furcolor):
        self.species = species
        self.furcolor = furcolor

    def call(self):
        return '{} is calling'.format(self.species)


class Dog(Animal):

    def __init__(self, species, furcolor, name):
        super().__init__(species, furcolor)
        self.name = name

    def get_name(self):
        print(self.name)


dog1 = Dog('dog', 'red', 'lucky')
print(dog1.call())
print(dog1.leg)
dog1.get_name()

dog is calling
4
lucky

继承其实比较好理解的,子类可以调用父类的属性和方法,如果子类重新进行了定义(我们通常叫重写),那就会使用子类的属性。

论私有化

在正式聊私有化之前,我希望你记住一句话,Python的私有化不是真正意义上的私有化。

默认情况下,我们是可以直接发问对象的属性和方法的,如下所示。

代码语言:javascript
复制
class Animal:

    leg = 4

    def __init__(self, species, furcolor):
        self.species = species
        self.furcolor = furcolor

    def call(self):
        return '{} is calling'.format(self.species)


dog = Animal('dog', 'gray')
print(dog.species)

dog

但有人觉得这样做破坏了封装的原则,我认为主要原因有两个。

第一目的是为了让程序员直接调用接口(可能是部分方法),而不用去关心具体内容,因为对他们而言,调用这些属性和方法没有意义。

第二个目的是在继承时的考虑,如果子类和父类具有同样的属性,那子类必定会覆盖属性,,定义了私有属性可以防止这样的事情发生。

那怎么让属性私有化了?其实很简单,我们用双下划线开始定义属性即可。

代码语言:javascript
复制
class Animal:

    leg = 4

    def __init__(self, species, furcolor):
        self.__species = species
        self.furcolor = furcolor

    def call(self):
        return '{} is calling'.format(self.species)


dog = Animal('dog', 'gray')
print(dog.species)

Traceback (most recent call last):
  File "/Users/luopan/Python练习/Python基础语法/类与对象.py", line 136, in <module>
    print(dog.species)
AttributeError: 'Animal' object has no attribute 'species'

还记得我之前说的那句话吗,真的不能调用了吗?我们来看看实例的dict属性。

代码语言:javascript
复制
class Animal:

    leg = 4

    def __init__(self, species, furcolor):
        self.__species = species
        self.furcolor = furcolor

    def call(self):
        return '{} is calling'.format(self.species)


dog = Animal('dog', 'gray')
print(dog.__dict__)

{'_Animal__species': 'dog', 'furcolor': 'gray'}

我们发现其实私有属性改为了_Animal__species,所以调用它,也是可以反问私有属性的。

代码语言:javascript
复制
dog = Animal('dog', 'gray')
print(dog._Animal__species)

dog

所以,有人不太赞同这种写法,并使用单下划线来代替,易于理解,定下这个规定,程序员也不在类外部访问这种属性。

总结

今天的分享就到这了,但Python类与对象的并不止这些,接下来我会慢慢分享给大家,希望大家持续关注罗罗攀,我们下期再见~

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 继承
  • 论私有化
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档