Python中的新奇玩意

面向对象编程的核心就是类,而Python是面向对象的,虽然也可以不面向对象,但于Python而言,学学Python的类还是很有必要的。

Python定义类的结构


class ClassName(baseClass):
       "optional documentation string"
        staticMemberDeclarations
        method_declarations

Python定义类的结构说明

使用class关键字定义类,并为其提供一个基类,如果没有合适的基类,就object作为基类。这个和C#很像,C#中的每一个对象的祖宗类都是object。

class之后的哪一行相当于是文档注释,用来告诉代码阅读者,这个类是干什么事情滴,有什么用,当然了,这个是可以不写的。

再之后就是静态成员定义,这个我有点不理解,为啥一定要在这里强调是静态成员呢?为什么不是动态成员呢?为什么非要强调“静态”二字呢?这个问题,先不讨论,我一会研究研究,研究完了,再说它。

静态成员之后,是方法的定义,方法的定义在上一篇文章中已经说过了,在这里,就不用再写示例了吧!下面研究Python类的成员。

Python类的成员

在开始之前需要先说明一点东西,Python中类的所有方法的名字的开始和结束都有下划线(_)的方法,都是特殊方法。

  • _init_()
    这个方法相当于是C#的构造函数,当一个类实例被创建的时候,这个方法会自动执行,在类实例创建完毕后执行。但有一点是特别重要的“这个方法并不创建对象,它仅仅只是对象创建后执行的第一个方法,这样做的目的就是为了初始化对象”,这个方法可以被覆盖,这个和C#的构造函数很类似,C#的构造函数,默认是无参数,但是可以写有参数的构造函数,如果不写构造函数,那C#的编译器会自动创建一个无参数的构造函数,但是如果写了有参数的构造函数,那么默认会把无参数的构造函数干掉,除非写一个无参数的构造函数。在写C#类的时候,一般都是会写一个无参和一个或几个有参的构造函数。

    令人不解的self

    基本上类的每一个方法都有一个self参数,这个参数不是我加上去的,而是编辑器自动加上去的,请看下面代码:

class FooClass(object):
    #My first class
    version=0.1
    def __init__(self,nm='John Doe'):
        self.name=nm
        print 'Created a class instance for',nm

    def showName(self):
        print 'Your name is',self.name
        print 'My name is',self.__class__.__name__

    def addMySelf(self,x):
        return x+x

这个参数是不是很奇怪?它就是C#中的this关键字,代表的意思就是对象本身。咱们现在已经写好类了,是不是该用一用了?

myFood=FooClass()
myFood.showName()
print myFood.addMySelf('1234')
输出结果是:
Created a class instance for John Doe
Your name is John Doe
My name is FooClass
12341234

好像又出来了两个不懂的玩意__class__.__name__,这俩是什么东西?我也不知道啊,但从上面的代码输出结果里可以猜出个一二,下面咱们看看有没有猜对。

__class__.__name__

  • __class__和c#的对象toString()是一样的,C#的默认方法toString()就是输出类的命名空间(.)类名,注意有个点啊!
    而Python的__class__就是输出这么一个玩意<class '__main__.FooClass'>,是不是慌了?怎么又整出来个__main__,这个又是什么东东呢?
  • __main__
    要想知道这个玩意是啥,咱们需要先知道__name__是个啥意思才行。
  • __name__
    我终于弄明白这个是啥意思了,这个__name__有两个意思,它有两个值,一个值就是模块的名字,另一个值就是__main__了。

因为Python是分模块的,如果模块是被导入的,那么__name__的值就是模块的名字,在上面的那个代码里,它的值就是其模块的名字,也就是FoodClass了。还有一种情况就是,如果模块是被直接执行的,那么__name__的值就是__main__了。

是不是犯迷糊了?__name__都还没说清楚,就又说了三个新东西,什么是模块?什么是被导入?什么又是被直接运行?莫急,莫急!下面咱们就说说这三个玩意又是啥东西。

Python中的模块是什么意思?

一个.py文件就是一个模块。.py是Python文件的后缀名,当然也会有别的后缀名,前面的文章中已经说过了,这里不赘述。

这个模块是啥意思呢?我觉得类比是最能说清楚问题的,还是和C#类比,C#源文件的后缀是.cs,那么这个.cs文件就相当于是Python的模块,C#怎么用这个.cs后缀的文件呢?需要导入命名空间,然后才能使用。同样Python怎么使用模块呢?先导入模块,怎么导入呢?这个导入关键字和java一样,都是import,而C#是using,导入之后怎么用呢?模块后打点使用。


First.py文件的内容如下
class FooClass(object):
    #My first class
    version=0.1
    def __init__(self,nm='John Doe'):
        self.name=nm
        print 'Created a class instance for',nm

    def showName(self):
        print 'Your name is',self.name
        print 'My name is',self.__class__

    def addMySelf(self,x):
        return x+x

怎么使用First.py文件中的方法呢?

import  First

stest=First.FooClass()
stest.showName()

输出结果如下:
Created a class instance for John Doe
Your name is John Doe
My name is <class 'First.FooClass'>

这下应该明白怎么写Python模块,怎么用Python模块了吧!但是有一点需要说的是,使用import导入模块的时候,这个模块中的代码会被从头到尾执行一次,当然,也只是在第一次引入的时候执行,之所以这么做,是为了节约时间吧!

模块咱们说完了,接下来该回过头说__name__的两个值了,现在这个东西的两个值就很好懂了。来看下我的测试,就很容易的明白什么时候是模块名字,什么时候是__main__了。也会清楚什么是被导入,什么是被执行了,先不多说,先看代码以及输出值。

睁大眼睛看仔细喽


class FooClass(object):
    #My first class
    version=0.1
    def __init__(self,nm='John Doe'):
        self.name=nm
        print 'Created a class instance for',nm

    def showName(self):
        print 'Your name is',self.name
        print 'My name is',self.__class__

    def addMySelf(self,x):
        return x+x
print __name__
输出的结果是:__main__

上面这个代码是在First.py文件里面的,下面咱们来看看test.py文件中的代码以及输出的值。

import  First

print  "test.py:",__name__
输出的结果如下:
First
test.py: __main__

看到这个结果是不是有点明白了呢?因为导入模块的时候,模块中的代码会执行一次,所以在test.py文件中输出的First,其实是First文件中的__name__的值。有没有发现一个问题就是,这个__name__的值在自己的模块里是__main__而在别的模块里是模块的名字呢?这个是不是有点迷糊了?

其实我刚开始也迷糊,不过现在不迷糊了,只要记住一句通俗易懂的话就可以了“在我自己的地盘里,谁都知道我是谁,所以我就报我的外号__main__就行,但是在别人的地盘上,压根就没人知道我是谁,所以我得报我的真实名字才会有人知道我是谁,所以这个时候,我报的就是我的模块的名字”。

一句话,在自己的地盘里谁都知道你是谁,所以就喊你的代号__main__,而在别人的地盘,没人认识你,你就得报自己的名字了。这和咱们的生活很相似啊!在老家的时候,你用你的小名是可以的,因为村里人都知道是你,但是在新的地方,你还能用小名吗?比如说,你买个东西,填的是小名,因为有事,让人带领,填了别人的电话,别人不知道你的小名,这是不是会导致你的快递没人领呢?

现在还剩最后一个问题__main__究竟是有什么用呢?

我大致搜了一下,搜到的结果中基本上都有这么一行代码,我觉得这行代码,就是__main__的意义所在了。因为我接触Python也就这几篇文章的时间,可能我的想法不对,但我现在认为我的想法是对的。先看代码,然后再说我的想法。

if __name__ == '__main__':

这行代码网上好多文章都在说,其实我觉得这行代码的意思就是为了判断是不是有熟人认识你这个模块?也就是说,判断一下,当前的你是不是在自己的地盘。然后执行与之对应的操作。你在自己的地方,就是__main__,不在就是你的模块名字。就这么简单吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值