类比C++ 学习Python的class
前言
本博文介绍一些学习python类的基础知识,以备遗忘后从新找回。
与C++的OOP一样,python的类也应该有封装、多态、继承性,也应该有构造函数、析构函数、成员函数、成员变量等内容。
最基本的类
class Super:pass
这样就定义了一个基本类 Super.在python 里面定义类需要使用关键词class.
类与实例
C++中 静态方法、静态成员属于类,而使用this指针的成员函数与成员变量却是属于实例的。实例的内容由this这个关键指针来实现不同实例的成员变量可以取不同的值,而静态方法却因为没有this指针而只能被类的所有实例共享。
类比于C++,在python 里面,类与实例的成分是分的比较开的,同样也类似于一个this指针的东西来选址不同实例的不同变量。
如下面代码所示:
__author__ = 'jmh081701'
class Supers:InstanceCnt=0def __init__(self):self.instance=0Supers.InstanceCnt+=1def display(self):print(Supers.InstanceCnt)if __name__ == '__main__':l=0s=Supers()s.display()s1=Supers()s1.display()
在python里面 写在和类函数一级的类似于C++中的静态变量,这个不属于实例,同一个类的不同对象都共享这个东西。另外python里面访问静态变量需要通过 类名.静态变量名
这种方式访问。
def __init__(self):pass
这种第一个参数是self的class里面的函数叫做成员函数。self就相当于C++里面的this指针。
def __init__(self):self.instance=0Supers.InstanceCnt+=1
self.instance 这种在成员函数内使用self.变量名
访问的是实例的变量,例如 self.instance是属于某个具体实例的。
另外
class Supers:InstanceCnt=0def __init__(self):self.instance=0Supers.InstanceCnt+=1def display(self):print(Supers.InstanceCnt)def classFun():print('ClassFun')
像最后一个函数classFun()里面最左边的参数不是self,那么这个函数就只能通过类名.classFun()
来访问了。
而通过对象访问的函数、变量一定是第一个参数为self的那些函数。
上面这一点与C++不同。
创建对象
假设这么一个类:
class Supers:InstanceCnt=0def __init__(self):self.instance=0Supers.InstanceCnt+=1def display(self):print(Supers.InstanceCnt)def classFun():print('ClassFun')
为了生成对象,我们使用对象名=类名(参数列表)
来生成一个对象
如:s1=Supers()
其中参数列表必须将类的 构造函数init()函数的所有参数都确定完。其中self除外,因为self是由解释器自己加上的,不用我们操心。
另外 python不允许一个类里面有多个构造函数。这是因为在C++中函数重载的基础是不同函数可以依照参数列表中参数的个数和类型来生成不同的signature。然而,python是类型无关的,所以无法使用类型的为函数生成signature,又因为python中函数是的参数是可以有默认值得,而有默认值的函数可以在调用的时候少传入一些默认参数,这使得也无法使用参数个数来为函数打上signature 因为解释器根本不晓得这些参数个数到底是多少。同样的,在一个类里面不可以出现两个名字一样的函数,而不管是不是构造函数;但是允许继承的时候重载。
再另外,在python中,如果重写了init()函数,那么这个函数的父类的init构造函数是需要手动写代码调用的。这也是与C++不同的地方。
对象内成员变量的访问
对象的成员变量需要是在init中使用self.XXX先申明过的变量,通过逗号运算符来访问。如s=Supers()
那么为了访问instance只需要:s.intance即可。注意 s.IntanceCnt是错误的哦,因为IntanceCnt不是属于对象的,而是属于类的。
类的内置属性
与C++不同,python的类有一些内置属性:
__dict__ : 类的属性(包含一个字典,由类的数据属性组成)
__doc__ :类的文档字符串
__name__: 类名
__module__: 类定义所在的模块(类的全名是'__main__.className',如果类位于一个导入模块mymod中,那么className.__module__ 等于 mymod)
__bases__ : 类的所有父类构成元素(包含了一个由所有父类组成的元组)
类的继承
与C++一样,python也可以有类与类之间的继承。
定义:
class XXX(parameter-list):pass
其中parameter-list是那些XXX想要继承的东西。这个是一个元组,可以为多个元素。
与C++不同的是:
1.python的继承是public继承,继承特性同c++的public继承。
2.python如果子类重载父类的方法,那么父类的方法默认不执行,需要我们显示的调用父类的同名函数,同时传入合适的self参数。
类的private和public
默认在的类中声明的变量名的变量都是Public到处可见。如果要声明private这种属性的变量,请在该变量声明的时候在前面加上两个下划线__;如果声明protected的属性的变量则在声明的时候在变量名前加一个下划线。
例如:
__author__ = 'jmh081701'
class Supers:InstanceCnt=0def __init__(self):self.instance=0self.var1=0self._var2=0self.__var3=1Supers.InstanceCnt+=1def display(self):print(Supers.InstanceCnt)class Derived(Supers):def __init__(self):Supers.__init__(self)print("Derived ")if __name__ == '__main__':l=0d=Derived()print(d.var1)
其中 Supers类中,var1是public变量,_var2 protected变量,__var3是私有变量。而且 _var2只能在自己类或其他子类看到。
另外 在通过逗号运算符访问protected/private变量的时候,要添加下划线。
类比C++ 学习Python的class相关推荐
- python如何编程-编程零基础应当如何开始学习 Python?
这个问题下面这么多人推荐了这么多 Python 资源,估计零基础新手看到了会眼花缭乱吧. 作为非计算机专业出身.自学编程的过来人,我知道想找到一份适合自己的入门教程不容易.不如就在这里分享一下,如何鉴 ...
- python零基础难学吗-如何从零开始学习Python,零基础学python难吗
Python并不难学,它诞生至今已经过25个年头,但相对于其他语言,它更加易学.易读,非常适合快速开发,Python编程简单直接,更适合初学编程者. 那么,如何从零开始学习python呢? 可以分为这 ...
- python语言怎么学-如何从零开始学习Python,python语言编程入门
Python并不难学,它诞生至今已经过25个年头,但相对于其他语言,它更加易学.易读,非常适合快速开发,Python编程简单直接,更适合初学编程者. 那么,如何从零开始学习python呢? 可以分为这 ...
- 零基础学python知乎-编程零基础应当如何开始学习 Python?
这个问题下面这么多人推荐了这么多 Python 资源,估计零基础新手看到了会眼花缭乱吧. 作为非计算机专业出身.自学编程的过来人,我知道想找到一份适合自己的入门教程不容易.不如就在这里分享一下,如何鉴 ...
- python零基础好学吗-如何从零开始学习Python,零基础学python难吗
Python并不难学,它诞生至今已经过25个年头,但相对于其他语言,它更加易学.易读,非常适合快速开发,Python编程简单直接,更适合初学编程者. 那么,如何从零开始学习python呢? 可以分为这 ...
- python和excel的区别-对比Excel,轻松学习Python数据分析
阅读权限50威望2 级论坛币2119 个学术水平357 点热心指数383 点信用等级313 点经验103301 点帖子917精华在线时间8677 小时注册时间2012-3-28最后登录2020-10- ...
- 如何零基础学习python语言_零基础如何入门Python语言?有哪些学习建议?
众所周知,Python目前是最受欢迎的编程语言之一,尤其是对于零基础的初学者来说,Python语言更是十分的友好.因此,不少初学者常常会有这样一个共同的疑惑,零基础如何入门Python语言?本文就来给 ...
- 0基础学好python难不难_零基础学习Python难不难?Python有什么优势?
原标题:零基础学习Python难不难?Python有什么优势? Python是一种计算机程序设计语言.首先,我们普及一下编程语言的基础知识.用任何编程语言来开发程序,都是为了让计算机干活,比如下载一个 ...
- python后端学什么框架_献给正在学习python的你, 10个最受欢迎的Python开源框架
很多小伙伴在学习wen的时候说,有没有几个常用的框架,好多小伙伴都只说对了其中几个,只有少部分是说正确的,想要了解更多,欢迎大家订阅微信公众号:Python从程序猿到程序员,或者加4913.08659 ...
最新文章
- Oracle优化器:星型转换
- java 设置日期的格式_java时间格式大全
- XCode Could not launch quot;quot; failed to get the task for process
- 【简便代码】1082 射击比赛 (20分)_17行代码AC
- 前端学习(1341):mongoose验证规则延伸
- 网址发布页模板,带网址测速+域名检测功能
- 苹果cms对接影视小程序源码完整源码
- linux强制删除后登录不了,【已解决】更新之后无法登录
- SpringIOC原理
- Html之图片轮播(锚)
- SqlServer存储过程基础
- java web target_Java Web系列:Java Web 项目基础
- K8S学习笔记之MiniKube的搭建(VM虚拟机环境)
- 吴恩达深度学习——人脸识别与神经风格转换
- Sketch for mac v78 矢量绘图软件
- LDC1314 学习资料
- 复活Google右键翻译方法及Google浏览器网页一键翻译
- JavaEE-常用API(String、ArrayLis)
- 大数据时代的变革与顺势而为——读《大数据时代》
- 美术文献杂志美术文献杂志社美术文献编辑部2022年第7期目录