Python 编程 | 连载 15 - Python 的类

简介: Python 编程 | 连载 15 - Python 的类

一、类与面向对象

利用对象的属性和方法去编程的过程就是面向对象编程,其中自定义对象数据类型就是面向对象中类的概念

定义类的关键字 class,class 用来声明类,类的名称首字母大写,包含多个单词的情况下每个单词的首字母大写

# 定义一个类
class Hero(object):
    name = 'Stark'
    def fight(self):
        print('IronMan fighting with thanos')
# 实例化一个对象
stark = Hero()
# 调用对象属性
print(stark.name)
# 调用对象的方法
stark.fight()
复制代码

f73e97e454dd4341afde034fd0b19851_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

类的参数self:

  • self是类函数中的必传参数,且必须放在第一个参数位置
  • self是一个对象,代表了实例化的对象本身
  • self可以直接通过打点来定义一个类变量
  • self中的变量与含有self参数的函数可以在类中任何一个函数内随意调用
  • 非函数中定义的变量在定义的时候不用self
class Hero(object):
    name = None
    address = None
    def fight(self):
        print('%s fight with thanos' % self.name)
    def rescue(self):
        print('%s helping people' % self.name)
steve = Hero()
steve.fight()
steve.rescue()
# 给属性赋值
stark = Hero()
stark.name = 'IronMan'
stark.fight()
stark.rescue()
# 定义新的属性
stark.suit = 'Mark 85'
print(stark.suit)
print(steve.suit)
复制代码

0c3437aa89794add81bb42966ce93eb8_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

实例化对象可以自定义属性,实例化对象自定义的属性是独立的

Hero 类中定义新的函数 work

class Hero(object):
    # 其余内容保持不变
    def work(self):
        self.fight()
        self.rescue()
# 调用work函数
stark.work()      
复制代码

7fbfb8829e5c4284a4268dc2e920ec05_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

self 表示当前类的实例化对象,可以通过打点的方式调用类中定义的函数。

Hero 类新增一个普通函数,既不带 self 参数的函数,并用实例化的对象调用该函数。

class Hero(object):
    # 其他函数保持不变
    def walk():
        print('walking')
# 其余代码保持不变
stark.walk()
复制代码

a6961d884bd744c1bef7d88c6a8910cc_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

walk() 函数本身没有参数,但是通过实例化对象调用时会自动传入self参数,因此出现了控制台打印出来的报错信息。

在类中定义的函数不添加self参数,就无法通过实例化对象调用。

在类函数中定义的函数,只能在当前函数体内调用。

class Hero(object):
    # 类中其他属性和函数保持不变
    def work(self):
        def walk(name):
            return name
        res = walk(self.name)
        print('{} is walking'.format(res))
        self.fight()
        self.rescue()
# 其余代码保持不变
stark.work()   
# 在定义的函数体外调用会报错
walk()
复制代码

99ae6c1d4a054fc48f4b20d28fa89491_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

将walk定义在Heros类的上面,这样walk函数就变成了一个全局函数,就可以随意调用

二、类的构造函数

累的构造函数是类中的一种默认函数,用来将类实例化的同时,对属性进行赋值

# 构造函数名必须为__init__,必须包含self参数
def __init__(self, name, address):
    self.name = name
    self.address = address
复制代码

给 Hero 类增加构造函数

class Hero(object):
    name = None
    address = None
    def __init__(self, name, address):
        self.name = name
        self.address = address
    def fight(self):
        print('%s fight with thanos' % self.name)
    def rescue(self):
        print('%s helping people' % self.name)
# 有了构造函数后,实例化对象一定要传递对象属性
stark = Hero('IronMan', 'NY')
print(stark.name)
print(stark.address)
stark.fight()
stark.rescue()
复制代码

6a14928bff6e456e9418ebe3b1bf0d33_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

三、对象的生命周期

9b0576c7be5e49a89d8732d3aee87ffd_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

四、私有函数与私有变量

私有函数和私有变量:

  • 无法被实例化后的对象调用的类中的函数与变量
  • 类内部可以调用私有的函数和变量
  • 只希望在类内部使用,不希望被实例化的对象使用

只要在变量和函数前添加__既连续两个下划线,就定义了私有函数和变量

class Cat(object):
    def __init__(self, name):
        self.name = name
    def run(self):
        result = self.__run()
        print(result)
    def __run(self):
        return f'小猫{self.name}开心的奔跑着'
    def dump(self):
        result = self.__dump()
        print(result)
    def __dump(self):
        return f'小猫{self.name}开心的跳着'
cat = Cat(name = 'pipi')
cat.run()
cat.dump()
cat.__run()
复制代码

30f741de903e446c8e4902f6877b4f61_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

私有函数不可以通过实例化对象调用的

print(cat.__dir__())
复制代码

打印出所有的函数

9c92d81e4a4f4d9292a7e76ebf3f0e4e_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

print(cat._Cat__run())
复制代码

7275891553084a948f26dc09a068ae5b_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

成功调用私有函数。

私有属性

添加私有属性

class Cat(object):
    __cat_type = 'cat'
    def __init__(self, name, sex):
        self.name = name
        self.__sex = sex
    def run(self):
        result = self.__run()
        print(result)
    def __run(self):
        return f'{self.__cat_type}小猫{self.name}{self.__sex}开心的奔跑着'
    def dump(self):
        result = self.__dump()
        print(result)
    def __dump(self):
        return f'{self.__cat_type}小猫{self.name}{self.__sex}开心的跳着'
cat = Cat(name = 'pipi', sex='boy')
cat.run()
cat.dump()
复制代码

7bb212d57a0d41b18936089cd77e4d3a_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

print(cat.__sex)
print(cat.__cat_type)
复制代码

35336b0a59ae47eb90b23ccf4c9ecff0_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

print(cat.__dir__())
print(cat._Cat__sex)
print(cat._Cat__cat_type)
复制代码

fe6c5701e4214d07be7bf1faa40439e3_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

尽量不要在实例化对象中调用私有化内容

Python 中类的封装性

将不对外的私有属性或者方法通过可对外使用的函数而使用(类中定义私有的,只有类的内部可以使用,外部无法访问,可以保护隐私,明确区分内外。

class Parent(object):
    def __hello(self, data):
        print('hello %s' % data)
    def helloworld(self):
        self.__hello('world')
if __name__ == '__main__':
    p = Parent()
    p.helloworld()
复制代码

3d332c0d38ea4116bffb76047d510cc6_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

通过访问对外的函数hello可以实现对私有函数__hello的调用,这就是对私有函数的封装


目录
打赏
0
0
0
0
4
分享
相关文章
Python 高级编程与实战:深入理解性能优化与调试技巧
本文深入探讨了Python的性能优化与调试技巧,涵盖profiling、caching、Cython等优化工具,以及pdb、logging、assert等调试方法。通过实战项目,如优化斐波那契数列计算和调试Web应用,帮助读者掌握这些技术,提升编程效率。附有进一步学习资源,助力读者深入学习。
[oeasy]python081_ai编程最佳实践_ai辅助编程_提出要求_解决问题
本文介绍了如何利用AI辅助编程解决实际问题,以猫屎咖啡的购买为例,逐步实现将购买斤数换算成人民币金额的功能。文章强调了与AI协作时的三个要点:1) 去除无关信息,聚焦目标;2) 将复杂任务拆解为小步骤,逐步完成;3) 巩固已有成果后再推进。最终代码实现了输入验证、单位转换和价格计算,并保留两位小数。总结指出,在AI时代,人类负责明确目标、拆分任务和确认结果,AI则负责生成代码、解释含义和提供优化建议,编程不会被取代,而是会更广泛地融入各领域。
84 28
[oeasy]python083_类_对象_成员方法_method_函数_function_isinstance
本文介绍了Python中类、对象、成员方法及函数的概念。通过超市商品分类的例子,形象地解释了“类型”的概念,如整型(int)和字符串(str)是两种不同的数据类型。整型对象支持数字求和,字符串对象支持拼接。使用`isinstance`函数可以判断对象是否属于特定类型,例如判断变量是否为整型。此外,还探讨了面向对象编程(OOP)与面向过程编程的区别,并简要介绍了`type`和`help`函数的用法。最后总结指出,不同类型的对象有不同的运算和方法,如字符串有`find`和`index`方法,而整型没有。更多内容可参考文末提供的蓝桥、GitHub和Gitee链接。
42 11
[oeasy]python077_int类型怎么用_整数运算_integer_进制转化_int类
本文主要讲解了Python中`int`类型的应用与特性。首先回顾了`int`词根的溯源,探讨了整型变量的概念及命名规则(如匈牙利命名法)。接着分析了整型变量在内存中的存储位置和地址,并通过`type()`和`id()`函数验证其类型和地址。还介绍了整型变量的运算功能,以及如何通过`int()`函数将字符串转化为整数,支持不同进制间的转换(如二进制转十进制)。此外,文章提及了关键字`del`的使用场景,对比了Python与C语言中`int`的区别,并总结了整型与字符串类型的差异,为后续深入学习奠定基础。
45 1
Python 高级编程与实战:深入理解数据科学与机器学习
本文深入探讨了Python在数据科学与机器学习中的应用,介绍了pandas、numpy、matplotlib等数据科学工具,以及scikit-learn、tensorflow、keras等机器学习库。通过实战项目,如数据可视化和鸢尾花数据集分类,帮助读者掌握这些技术。最后提供了进一步学习资源,助力提升Python编程技能。
|
1月前
|
[oeasy]python074_ai辅助编程_水果程序_fruits_apple_banana_加法_python之禅
本文回顾了从模块导入变量和函数的方法,并通过一个求和程序实例,讲解了Python中输入处理、类型转换及异常处理的应用。重点分析了“明了胜于晦涩”(Explicit is better than implicit)的Python之禅理念,强调代码应清晰明确。最后总结了加法运算程序的实现过程,并预告后续内容将深入探讨变量类型的隐式与显式问题。附有相关资源链接供进一步学习。
39 4
Python 高级编程与实战:深入理解设计模式与软件架构
本文深入探讨了Python中的设计模式与软件架构,涵盖单例、工厂、观察者模式及MVC、微服务架构,并通过实战项目如插件系统和Web应用帮助读者掌握这些技术。文章提供了代码示例,便于理解和实践。最后推荐了进一步学习的资源,助力提升Python编程技能。
Python 高级编程与实战:深入理解性能优化与调试技巧
本文深入探讨了Python的性能优化和调试技巧,涵盖使用内置函数、列表推导式、生成器、`cProfile`、`numpy`等优化手段,以及`print`、`assert`、`pdb`和`logging`等调试方法。通过实战项目如优化排序算法和日志记录的Web爬虫,帮助你编写高效稳定的Python程序。
在线编程实现!如何在Java后端通过DockerClient操作Docker生成python环境
以上内容是一个简单的实现在Java后端中通过DockerClient操作Docker生成python环境并执行代码,最后销毁的案例全过程,也是实现一个简单的在线编程后端API的完整流程,你可以在此基础上添加额外的辅助功能,比如上传文件、编辑文件、查阅文件、自定义安装等功能。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
在线编程实现!如何在Java后端通过DockerClient操作Docker生成python环境
Python 高级编程与实战:构建 RESTful API
本文深入探讨了使用 Python 构建 RESTful API 的方法,涵盖 Flask、Django REST Framework 和 FastAPI 三个主流框架。通过实战项目示例,详细讲解了如何处理 GET、POST 请求,并返回相应数据。学习这些技术将帮助你掌握构建高效、可靠的 Web API。

热门文章

最新文章