bugstar

导航

Python模块和类.md

模块的定义

代码的层次结构

  • 对于python的层次结构一般为包->模块
  • 包也就是文件夹,但是文件夹下必须有文件"init.py"那么此文件夹才可以被识别为包。"init.py"文件可以为空,也可以不为空。不为空的情况以后详细写
  • 模块其实就是.py文件

类的基础

基本概念

在模块中定义一个类,类的最基本结构如下:

#对于模块的说明
'a test module'
#作者
__author__ = 'liyue'

#定义一个类名称为ClassDemo,继承类顶级类object
class ClassDemo(object):
    #定义一个类的成员函数
    def sayHello(x):
        print("Hello:%s" % x)

#下面的代码有两个作用:
# 1.调试或者执行当前文件,也就是ClassDemo时候,那么会执行下面代码
# 2.如果是其他文件调用当前文件,那么下面代码避免当前文件重复执行'''
if __name__ == "__main__":
    #测试本文件
    ClassDemo.sayHello('li')

类的调用

下面演示了怎么调用另一个模块的类:

#对于模块的说明
'a demo of call class'
#作者
__author__  = 'liyue'

#导入其他模块有两种写法:
# import modulename.classname as 别名
# from moudlename imprt classname as 别名

#import FunctionDemo.ClassTest as ct
from FunctionDemo import ClassTest as ct

class ClassCall:
    def testMain():
        #将当前的类名称传入
        funInstance = ct.ClassDemo()
        funInstance.sayHello()
        #普通的调用传入
        ct.ClassDemo.sayHello('ClassCall')

if __name__ == '__main__':
    #调用模块ClassTest的类
    ClassCall.testMain()

在这里要注意对于import的两种方式使用细节。在python中重要关键字都是用两个下划线作为标志,要注意写法且自己定义时候不能重名。

变量的作用域

  • 使用单下划线作为前缀的变量:_XXX表明这是一个私有的变量。
  • 这个私有的作用主要是用于编码规范,不能完全防止访问此变量。例如可以通过_classname_XXX的方式,且此此方式不是固定的。
  • 对于变量的访问最好通过函数封装来完成
    python的Syntactic sugar是需要特别注意的,一个函数没有入参,那么调用时候隐含了一个入参也就是self。也就是说对于一个函数:
def fun(paraA);
    pass

其真实的声明是这样的:

def fun(self, paraA):
    pass

上述内容代码:

#对于模块ClassTest.py的说明
'a test module'
#作者
__author__ = 'liyue'

#定义一个类名称为ClassDemo,继承类顶级类object
class ClassDemo(object):
    #定义一个类的成员函数
    def sayHello(x):
        print("Hello:%s" % x)

    name = ''
    _age = 0

    #定义一个初始化函数
    def __init__(self, name, age):
        self.name = name
        self._age = age

    #定义私有函数
    def getterName(self):
        return self.name
    def _getterAge(self):
        return self._age

    def pintNameAndAge(self):
        print('Name is:%s Age is:%s' % (self.getterName(), self._getterAge()))

#下面的代码有两个作用:
# 1.调试或者执行当前文件,也就是ClassDemo时候,那么会执行下面代码
# 2.如果是其他文件调用当前文件,那么下面代码避免当前文件重复执行'''
if __name__ == "__main__":
    #测试本文件
    ClassDemo.sayHello('li')

    #测试函数的封装
    cd = ClassDemo('zhangsan', 20)
    cd.pintNameAndAge()

对象信息

  • 可以用type来获取对象信息,type的返回值是类
  • 对于有继承关系的类而言用isInstance判断,所以通常用isInstance即可
#对于模块Animal.py的说明
'a demo of class type'
#作者
__author__  = 'liyue'


class Animal(object):
    pass

class Dog(Animal):
    pass

class Cat(Animal):
    pass

class PrintInfo(object):
    def testMain():
        a = Animal()
        d = Dog()
        c = Cat()
        print('Animal and Dog isInstance: %s' % isinstance(Animal, Dog))
        print('a and Dog Animal: %s' % isinstance(a, Animal))

        print("c's type is: %s" % type(c))

if __name__ == '__main__':
    PrintInfo.testMain()

实例属性和类属性

#对于模块Animal.py的说明
'a demo of class type'
#作者
__author__  = 'liyue'


class Animal(object):
    name = 'an animal'


class PrintInfo(object):
    def testMain():
        a = Animal()
        #没有绑定新的类属性,输出默认值
        print(a.name)
        #给实例绑定了类属性,输出实例的类属性值
        a.name = 'a dog'
        print(a.name)
        #类本身的属性值不变
        print(Animal.name)
        #删除实例绑定的类属性值
        del a.name
        #此时又输出默认的值
        print(a.name)

if __name__ == '__main__':
    PrintInfo.testMain()

posted on 2017-12-07 14:28  bugstar  阅读(604)  评论(0编辑  收藏  举报