zoukankan      html  css  js  c++  java
  • C++程序员学Python:Python里面的面向对象

    python里面也引入了面向对象的方法,除了一些C++的基本概念,还有其他一些不同,例如python的类有时候可以作为一个命名空间

    1 class MyData(object):
    2     pass

    python的继承语法是class class_name(parent_class_name),所以上面的MyData对象继承与object对象,至于object对象,则是python的内置对象,暂且不谈

    上面的就是声明了一个空类,但是和C++不同的是,这个类本身可以当作一个命名空间使用,例如:

    1 mathObj = MyData()
    2 mathObj.x = 4
    3 mathObj.y = 5
    4 mathObj.x + mathObj.y

    这个时候mathObj更多只是作为一个命名空间使用

    当我们需要定义一个成员函数的时候:

    1 class MyData(object):
    2     def printFoo(self):
    3         print "you invoked printFoo()"
    4     def printFoo2():
    5         print "you invoked printFoo2()"

    printFoo2的定义是错误的,调用成员函数printFoo2的时候,解释器会报错,因为他定义形参self,self就是C++里面的this,不过C++在我们定义成员函数的时候,会自动帮我们生成,不用像python这样手动生成(还是我不知道??),我们调用一个成员函数,python和C++也都会自动帮我们传递类对象,所以当我们调用printFoo2的时候,解释器帮我们传递self对象,但是printFoo2并没有定义这个形参

    当然,python里面的类也有构造函数和析构函数,与C++不同的是,python的构造函数是__init__,析构函数是__del__

    1 class MyData(object):
    2     def __init__(self):
    3         print "init"
    4     def __del__(self):
    5         print "del"
     
    1 obj = MyData()
    2 init
    3 obj = 2
    4 del

    当我们创建obj的时候,会调用__init__函数,当把obj指向其他的数据的时候,python启动垃圾回收机制,Mydata对象被删除了,同时也调用了__del__函数

    python还有一个比较注意的,就是创建类的时候会有一个同名的实例,例如我们有如下的类:

    1 class C(object):
    2     foo = 100

    如果我们输入print C.foo,那么解释器会输出100,如果我们输入C.foo = C.foo+1,那么C.foo会变成101,这时候如果我们b = C(),那么print b.foo会发现输出的是101,这是因为foo在这里实际上是一个静态变量,类似于C++在类里面定义了一个static int foo

    但是如果我们的C里面定义了一个function,我们调用C.function()会怎么样,会报错,这点跟foo不同,这个是因为function还没有和一个类去绑定

    在C++里面如果我们需要拿到一个类的信息,可以利用typeof,而python里面也有类似的功能,不过需要类继承自object

    有如下的:

    __name__:类名

    __doc__:类的文档

    __bases__:所有父类构成的元组

    __dict__:类的属性

    __module__:类所在的模块

    __class__:对应的类

  • 相关阅读:
    解决PLSQL Developer中文横着显示的问题
    品优购_day06
    品优购_day05
    品优购_day04
    品优购_day03
    品优购_day02
    java 学习中遇到的问题(二)泛型中<? extends T>和<? super T>的区别
    java 学习中遇到的问题(一)方法调用中的值传递和引用传递
    java中的字符串比较
    自学java 第十一章持有对象
  • 原文地址:https://www.cnblogs.com/linyilong3/p/2952826.html
Copyright © 2011-2022 走看看