python——面向对象——知识汇总三
Python封装机制及实现方法
封装(Encapsulation),即在设计类时,刻意地将一些属性和方法隐藏在类的内部,这样在使用此类时,
将无法直接以“类对象.属性名”(或者“类对象.方法名(参数)”)的形式调用这些属性(或方法),
而只能用未隐藏的类方法间接操作这些隐藏的属性和方法。
Python 类中的变量和函数,不是公有的(类似 public 属性),就是私有的(类似 private),这 2 种属性的区别如下:
- public:公有属性的类变量和类函数,在类的外部、类内部以及子类中,都可以正常访问;
- private:私有属性的类变量和类函数,只能在本类内部使用,类的外部以及子类都无法使用。
但是,Python 并没有提供 public、private 这些修饰符。为了实现类的封装,Python 采取了下面的方法:
- 默认情况下,Python 类中的变量和方法都是公有(public)的,它们的名称前都没有下划线(_);
- 如果类中的变量和函数,其名称以双下划线“__”开头,则该变量(函数)为私有变量(私有函数),其属性等同于 private。
除此之外,还可以定义以单下划线“_”开头的类属性或者类方法(例如 _name、_display(self)),这种类属性和类方法通常被视为私有属性和私有方法,虽然它们也能通过类对象正常访问,但这是一种约定俗称的用法。
注意,Python 类中还有以双下划线开头和结尾的类方法(例如类的构造函数__init__(self)),这些都是 Python 内部定义的,用于 Python 内部调用。我们自己定义类属性或者类方法时,不要使用这种格式。
class CLanguage: def setname(self, name): if len(name) < 3: raise ValueError('名称长度必须大于3!') self.__name = name def getname(self): return self.__name # 为 name 配置 setter 和 getter 方法 name = property(getname, setname) def setadd(self, add): if add.startswith("http://"): self.__add = add else: raise ValueError('地址必须以 http:// 开头') def getadd(self): return self.__add # 为 add 配置 setter 和 getter 方法 add = property(getadd, setadd) # 定义个私有方法 def __display(self): print(self.__name, self.__add) clang = CLanguage() clang.name = "C语言中文网" clang.add = "http://c.biancheng.net" print(clang.name) print(clang.add)
Python继承机制及其使用
继承机制经常用于创建和现有类功能类似的新类,又或是新类只需要在现有类基础上添加一些成员(属性和方法),但又不想直接将现有类代码复制给新类。
也就是说,通过使用继承这种机制,可以轻松实现类的重复使用。
子类继承父类时,只需在定义子类时,将父类(可以是多个)放在子类之后的圆括号里即可。语法格式如下:
class 类名(父类1, 父类2, ...):
#类定义部分
注意,如果该类没有显式指定继承自哪个类,则默认继承 object 类(object 类是 Python 中所有类的父类,即要么是直接父类,要么是间接父类)。
另外,Python 的继承是多继承机制(和 C++ 一样),即一个子类可以同时拥有多个直接父类。
Python父类方法重写
子类继承了父类,那么子类就拥有了父类所有的类属性和类方法。通常情况下,子类会在此基础上,扩展一些新的类属性和类方法。
但凡事都有例外,我们可能会遇到这样一种情况,即子类从父类继承得来的类方法中,大部分是适合子类使用的,
但有个别的类方法,并不能直接照搬父类的,如果不对这部分类方法进行修改,子类对象无法使用。
针对这种情况,我们就需要在子类中重复父类的方法。
如何调用被重写的方法
事实上,如果我们在子类中重写了从父类继承来的类方法,那么当在类的外部通过子类对象调用该方法时,Python 总是会执行子类中重写的方法。
这就产生一个新的问题,即如果想调用父类中被重写的这个方法,该怎么办呢?
很简单,前面讲过,Python 中的类可以看做是一个独立空间,而类方法其实就是出于该空间中的一个函数。而如果想要全局空间中,调用类空间中的函数,只需要在调用该函数时备注类名即可。
此程序中,需要大家注意的一点是,使用类名调用其类方法,Python 不会为该方法的第一个 self 参数自定绑定值,因此采用这种调用方法,需要手动为 self 参数赋值。
通过类名调用实例方法的这种方式,又被称为未绑定方法。
Python super()函数:调用父类的构造方法
在子类中的构造方法中,调用父类构造方法的方式有 2 种,分别是:
- 类可以看做一个独立空间,在类的外部调用其中的实例方法,可以向调用普通函数那样,只不过需要额外备注类名(此方式又称为未绑定方法);
- 使用 super() 函数。但如果涉及多继承,该函数只能调用第一个直接父类的构造方法。
也就是说,涉及到多继承时,在子类构造函数中,调用第一个父类构造方法的方式有以上 2 种,而调用其它父类构造方法的方式只能使用未绑定方法。
但在 Python 3.x 中,super() 函数有一种更简单的语法格式,推荐大家使用这种格式:
super().__init__(...)
Python多态及用法详解
Python枚举类定义和使用
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
2020-03-03 smtp——发送邮件——正文——html——图片附件——文件附件
2020-03-03 smtp——发送邮件——图片附件和附件
2020-03-03 smtp——发送邮件——转载
2020-03-03 smtp——发送邮件——发送附件02——多个附件
2020-03-03 smtp——发送邮件——发送附件01——单个附件