python package 的两种组织方式

 

方式一
/package1/

.../__init__.py

        # 空文件

 

.../class1.py

        class Class1:
            def __init__(self):
                self.name = "class one"

            def printInfo(self):
                print("i am class One!")

.../class2.py

        class Class2:
            def __init__(self):
                self.name = "class two"

            def printInfo(self):
                print("i am class two!")

/demo1.py

    from package1.class1 import Class1
    from package1.class2 import Class2

    if __name__ == "__main__":
        c1 = Class1()
        c1.printInfo()
        c2 = Class2()
        c2.printInfo()

 

#####################################

方式二

/package2/
.../__init__.py

        from .class1 import Class1
        from .class2 import Class2

 

... /class1.py

        class Class1:
            def __init__(self):
                self.name = "class one"

            def printInfo(self):
                print("i am class One!")

.../class2.py

        class Class2:
            def __init__(self):
                self.name = "class two"

            def printInfo(self):
                print("i am class two!")

 

/demo2.py

    from package2 import Class1, Class2

    if __name__ == "__main__":
        c1 = Class1()
        c1.printInfo()
        c2 = Class2()
        c2.printInfo()

 

 

时间: 2024-10-18 16:54:48

python package 的两种组织方式的相关文章

Python线程的两种编程方式_python

Python中如果要使用线程的话,python的lib中提供了两种方式.一种是函数式,一种是用类来包装的线程对象.举两个简单的例子希望起到抛砖引玉的作用,关于多线程编程的其他知识例如互斥.信号量.临界区等请参考python的文档及相关资料.1.调用thread模块中的start_new_thread()函数来产生新的线程,请看代码: 复制代码 代码如下: ###        thread_example.py   import time  import thread  def timer(no

Python 多线程开发的两种常用方式

目前python 提供了几种多线程实现方式 thread,threading,multithreading ,其中thread模块比较底层,而threading模块是对thread做了一些包装,可以更加方便的被使用. 2.7版本之前python对线程的支持还不够完善,不能利用多核CPU,但是2.7版本的python中已经考虑改进这点,出现了multithreading  模块.threading模块里面主要是对一些线程的操作对象化,创建Thread的class.一般来说,使用线程有两种模式: A

Python访问Oracle的两种数据获取方式

查询通常有两种方式:一种是使用cursor.fetchall()获取所有查询结果,然后再一行一行的迭代:另一种每次通过cursor.fetchone()获取一条记录,直到获取的结果为空为止.通过如下方式来验证这两种查询方式的区别:TEST表内容如下:(1, 'a', 'b', 'c')(2, 'aa', 'bb', 'cc')(3, 'aaa', 'bbb', 'ccc') 输出结果: 1, a, b, cNumber of rows returned: 32, aa, bb, ccNumber

《Mahout算法解析与案例实战》一一2.2 两种安装方式

2.2 两种安装方式 关于Mahout的安装配置,这里介绍两种方式:其一,下载源码(直接下载源码或者通过svn下载源码都可以),然后使用Maven进行编译:其二,下载完整包进行解压缩.下面分别对这两种方式进行介绍.2.2.1 使用Maven安装 使用Maven安装之前需要先安装Maven.首先到Maven官网http://maven.apache.org/download.cgi下载Maven软件,这里下载的是bin版本,解压到/home/mahout/apache-maven-3.1.0,然后

深入Android中BroadcastReceiver的两种注册方式(静态和动态)详解_Android

今天我们一起来探讨下安卓中BroadcastReceiver组件以及详细分析下它的两种注册方式. BroadcastReceiver也就是"广播接收者"的意思,顾名思义,它就是用来接收来自系统和应用中的广播.在Android系统中,广播体现在方方面面,例如当开机完成后系统会产生一条广播,接收到这条广播就能实现开机启动服务的功能:当网络状态改变时系统会产生一条广播,接收到这条广播就能及时地做出提示和保存数据等操作:当电池电量改变时,系统会产生一条广播,接收到这条广播就能在电量低时告知用户

spring aop两种配置方式_java

第一种:注解配置AOP 注解配置AOP(使用 AspectJ 类库实现的),大致分为三步: 1. 使用注解@Aspect来定义一个切面,在切面中定义切入点(@Pointcut),通知类型(@Before, @AfterReturning,@After,@AfterThrowing,@Around). 2. 开发需要被拦截的类. 3. 将切面配置到xml中,当然,我们也可以使用自动扫描Bean的方式.这样的话,那就交由Spring AoP容器管理. 另外需要引用 aspectJ 的 jar 包:

jQuery autoComplete插件两种使用方式及动态改变参数值的方法详解_jquery

本文实例讲述了jQuery autoComplete插件两种使用方式及动态改变参数值的方法.分享给大家供大家参考,具体如下: 一.一次加载.多次使用: 前端JS代码: /*客户名称自动匹配*/ function customerAutoComplete(){ $.ajax({ type:"GET", url:encodeURI("/approvalajax/salesOrderApproval_findCustomerList"), dataType:"j

ajax的两种提交方式(get/post)和两种版本_AJAX相关

最近比较闲,就把以前用过的技术串一下做个手札,方便以后自己偷懒,小鸟你们幸福了. 首先主要是将javascript版本ajax做下注释:ajax异步刷新主要是将所需条件拼成字符串传入后台,处理之后,直接调用回调函数将所得数据返还给页面,并加以显示,因为还在本页面,所以不用刷新页面,懂了了吧,本篇也用encodeURI对字符串做了加密,并在类里做了解码,其中需要一些注意的地方在源码里做了注释.get/post两种提交方式,但get提交容易乱码,一定多加注意 jsp页面: 复制代码 代码如下: <%

深入Android中BroadcastReceiver的两种注册方式(静态和动态)详解

今天我们一起来探讨下安卓中BroadcastReceiver组件以及详细分析下它的两种注册方式. BroadcastReceiver也就是"广播接收者"的意思,顾名思义,它就是用来接收来自系统和应用中的广播.在Android系统中,广播体现在方方面面,例如当开机完成后系统会产生一条广播,接收到这条广播就能实现开机启动服务的功能:当网络状态改变时系统会产生一条广播,接收到这条广播就能及时地做出提示和保存数据等操作:当电池电量改变时,系统会产生一条广播,接收到这条广播就能在电量低时告知用户