二级c语言和python,python中c类继承a类和b类

  二级c语言和python,python中c类继承a类和b类

  在写之前,本文将从类的角度讨论python和C在语法和用法上的区别。

  主要内容语法方面:

  先看一个简单的C类例子:

  A类{ public:int I;void test(){ STD:cout I endl;}};A aa.i=100a . test();Output 100这个A类非常简单,只使用了一个数据成员I和一个测试函数来输出I的值。

  但是从语法上来说,当我们用实例对象A调用测试成员函数时,这个函数是如何在内部找到这个I的呢?也就是说,在执行测试函数的代码的时候,你怎么发现这个我绑定到了A对象上?

  原因很简单:我们经常称这个指针。c编译器会将上述代码加工成以下半成品:

  A类{ public:int I;void test(this){ STD:cout this-I endl;}};A aa.i=100a .测试(a);编译器将使用默认的this指针作为非静态成员函数的默认参数,并帮助我们添加它。使用对象调用时,会传入对象的地址,在成员函数内将this- call添加到类内部的成员中,这样就很容易区分不同对象的调用访问的是各自对象的空间内容。

  c编译器帮我们传递这个指针的参数,加上修饰,就不用写了。

  python如何处理这种情况?

  如果你遵循C的方法,你会得到下面的代码:

  A类:i=10上面的代码DEF (): print (i) a=a () a.test()不能通过。第一个问题是方法的调用有错误。执行错误将显示test()实际上没有参数,但是我们给他传递了一个参数。这是为什么呢?

  原因是如果你用对象的方式调用一个对象的方法。方法,python也会帮你传入一个名为self的变量,这个变量标识调用的是哪个对象,就像c一样,这个self是对当前对象A的引用,也就是它也指向A所指向的内存空间中的对象,虽然看起来我们没有传入任何参数,但是python的解释器会帮我们这么做,帮助它区分不同的对象。上面的代码在定义测试函数的时候没有写self参数来测试。结果我们也可以看到python在调用的时候帮我们传入了一个对self的引用,但是在定义的时候并没有帮我们添加这个参数,和c不一样,修改之后我们得到了下面这个版本:

  A类:i=10Test (self): print (i) a=a () a. Test(执行完这段代码后,仍然给出错误:测试函数中没有找到变量I的定义。这是为什么呢?

  也是这个道理,因为python在定义类的方法时,没有帮我们在变量I前面加上self。当然,自我是测试的参数。这个self是一个约定俗成的名字,可以更改,所以python既然没有在函数的参数中给你添加,自然也不会在函数内部添加。所以如果这个I指的是类中定义的变量,就必须用self来修饰。告诉python解释器。

  修改后得到最终版本:

  A类:i=10测试(自我):打印(自我。I) a=a () a .测试(成功输出10。

  Python和C在类对象调用方法中使用传入实例对象的指针或引用来区分不同的调用对象,但实际语法形式略有不同,尤其是python,需要注意。

  一个有趣的现象:

  下面的代码会输出什么?1还是2?买断你的手~

  class(object):I=1 deftest _ print(self):print(I)t=test()I=2t。Test _ print()答案是输出2。

  反正第一次看的时候觉得不对。对于使用C较多的我来说,先入为主的观念比较重。首先,这个我不是自我装饰的。这个I不是指在类测试中定义的I。所以当对象T调用test_print方法时,虽然T的引用传递给了self,但此时在函数内部是无法准确找到这个I的,因为这个I在函数内部是未定义的。

  现在,我们将讨论python的另一个语言特性,即访问引用的方式:

  有两种方法可以访问参考符号python。

  -直接引用:直接使用被引用的名称进行访问,Python搜索名称的方式与搜索LEGB范围相同。

  -间接访问:使用objname.attrname来引用名称attrname。Python不搜索范围,直接去对象找属性。

  以上方式是直接访问I!直达号怎么样?如果你不知道,可以看看这篇博客:ython Advanced _ About Namespace and Scope(详细解释)

  简而言之,这个I就是在函数外层的嵌套作用域中寻找这个变量的定义。自然,这个I是在全局区域找到的,所以输出是2。

  这个物业上面是个坑,小心防雷。

  python中的方法和函数的概念与c中的不同。

  C类的成员函数分为静态成员函数和普通成员函数(不考虑访问限制)。可以通过类名直接访问静态成员(变量和函数),但是不能访问普通成员和函数。普通的函数和成员属于对象,需要这个指针来调用,但是没有类名。

  对于python来说,没有静态和非静态的概念。python的类中定义的函数是实例的方法,类名调用的是函数。函数和方法不属于同一类型。方法由实例对象调用,对象本身的引用默认会传入self参数,而由类名调用的函数对象是从属于该类的函数对象。当调用这个函数时,它需要显示的传入实例对象作为参数。两种调用方法的结果是一样的。X.f()等价于MyClass.f(x)。

  Python类是抽象对象,实例是类对象。python中的一切都是对象,所以类本身也是对象。在C #中,类是抽象代码段,但它不是对象。在C #中,类是一个作用域,通过它只能访问静态信息。python中的类是一个抽象对象,描述了整个类的抽象信息。

  参加测试:

  class:passa=a()print(type(a))print(type(a))Output class type class _ _ main _ _。 A 输出结果我们可以看到,A类的类型是类型类,A的类型是A类,也就是说,A类的对象是包含类信息的对象,其用途自然不同于实例对象。

  构造函数和析构函数是C类的特点。c编译器会在类中添加默认的无参数构造函数、复制构造函数等等。python呢?

  Python没有构造函数析构函数的概念。毕竟内存管理是交给GC而不是程序员管理的,但是python有一个默认的初始化方法__init__。python默认会提供一个无参数的__init__方法(这里没有参数不包括self),但是我们可以重写这个方法,定义自己的方法,添加参数进行合理的初始化。但是记住python只重写不重载,一个变量名只能引用一个对象,所以用同一个符号根据不同的参数调用不同的函数在python中是不存在的!所以原著一旦改写,就没了!但在c中不是这样,虽然一旦我们重载了构造函数,编译器就不会提供无参数的构造函数,但我们可以继续重载多少个可选的都没关系。

  值得一提的是,这个__init__方法的调用和C调用构造函数是一样的,都是在对象实例化的时候通过类的名字来调用。

  C的继承和python的继承有什么区别?

  一个有“类”的语言,没有继承是没有多大价值的,所以python当然支持继承,不仅是继承,还有多重继承。这和C一样,不像Java果断抛弃了类的多重继承来开放接口。

  Python的继承语法如下:

  类派生类名(基类名):语句-1的定义.语句-n基类名称必须对派生类可见。

  Python的继承有几个特点,语法上和C略有不同。同时,当一个派生类对象调用一个方法时,它和C的是一样的。首先,看派生类本身是否有定义。如果没有,就去父类。

  其他属性与C基本相同.

  Python支持多重继承。多重继承的类定义如下:

  类别衍生类别名称(基底1、基底2、基底3):陈述式-1.statement-n python中所有的类都是从object派生出来的,C中没有这个概念是因为C不是纯面向对象的语言,而Python和Java一样,通过一个所有类的基类来抽象所有类的抽象信息,方便用户使用和一些高级机制实现。这是C不具备的高级机制,但是这样的机制也使得这些语言需要为每个对象付出额外的空间来保存这些信息,同时也降低了执行的效率。

  门禁和门禁有什么区别?

  不用说,成员的访问权限可以被访问控制关键字限制,比如public private protected。在python中没有这样的限制。没有不能访问的私有变量,但是python中有一个约定:

  以下划线开头的名称(如_spam)应该用作非公共API(无论是函数、方法还是数据成员)。这应该是具体实现,没必要提醒它改。

  也就是说,这样一个成员,你想访问就可以访问,想修改就可以修改,只是不对外提供,而是实现这个类的人为了实现某些功能而定义的一个子函数或者变量。

  python类的特殊属性

  毕竟python是一种动态语言,可以动态的给对象添加属性。这是python作为高级语言的特点,是C类所不具备的。您添加到对象的属性属于该对象。

  A类:passa=A();年龄=40岁。like=篮球迭代器

  这很有意思。C的类不支持迭代器,C只支持STL中容器的迭代器。迭代器是一种智能指针,它封装了指针并提供了一种遍历容器的方法。在C中,迭代器是一个容器的概念。

  在Python中,迭代器不仅可以作用于容器,也可以作用于类。在遍历类对象时,还可以自定义迭代器迭代的结果。而python作为一种高级语言,直接将迭代器嵌入到for …in…的语法中。

  具体语法见文档。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • c语言调用退出函数 c语言退出整个程序怎么写
  • c语言中怎么给函数初始化 c语言的初始化语句
  • c语言编写函数计算平均值 c语言求平均函数
  • 详解c语言中的字符串数组是什么,详解c语言中的字符串数组结构,详解C语言中的字符串数组
  • 表达式求值c++实现,c语言实现表达式求值
  • 看懂c语言基本语法,C语言详解,C语言的基本语法详解
  • 用c语言实现快速排序算法,排序算法设计与实现快速排序C语言,C语言实现快速排序算法实例
  • 深入解析c语言中函数指针的定义与使用方法,深入解析c语言中函数指针的定义与使用情况,深入解析C语言中函数指针的定义与使用
  • 描述E-R图,E-R图举例,关于C语言中E-R图的详解
  • 折半查找法C语言,折半查找算法(算法设计题)
  • 折半查找法C语言,c语言折半法查找数据,C语言实现折半查找法(二分法)
  • 扫雷小游戏c++代码设计,c语言扫雷游戏源代码,C语言实现扫雷小游戏详细代码
  • 怎样统计程序代码行数,C语言统计行数,C#程序员统计自己的代码行数
  • 基于c语言的贪吃蛇游戏程序设计,用c语言编写贪吃蛇游戏程序,C语言实现简单的贪吃蛇游戏
  • 图的两种遍历算法,图的遍历算法代码c语言,Python算法之图的遍历
  • 留言与评论(共有 条评论)
       
    验证码: