模块与类

要使用一个模块,我们必须首先导入该模块。Python使用import语句导入一个模块。

例如:import.模块名(import.math)

如果我们只希望导入用到的math模块的某几个函数,而不是所有函数,可以用下面的语句:

from 模块名 import 函数名(函数必须存在于模块中)

动态导入模块:

利用import ... as ...,还可以动态导入不同名称的模块

Python 2.6/2.7提供了json 模块,但Python 2.5以及更早版本没有json模块,不过可以安装一个simplejson模块,这两个模块提供的函数签名和功能都一模一样

try:
    import json
except ImportError:
    import simplejson as json
print json.dumps({‘python‘:2.7})

__funture__模块:

当新版本的一个特性与旧版本不兼容时,该特性将会在旧版本中添加到__future__中,以便旧的代码能在旧版本中测试新特性

使用from __future__ import unicode_literals将把Python 3.x的unicode规则带入Python 2.7中。


参考代码:


from __future__ import unicode_literals
s = ‘am I an unicode?‘
print isinstance(s, unicode)
 

定义类并创建实例:

在Python中,类通过 class 关键字定义。以 Person 为例,定义一个Person类如下:

class Person(object):
    pass

按照 Python 的编程习惯,类名以大写字母开头,紧接着是(object),表示该类是从哪个类继承下来的。

 

在定义 Person 类时,可以为Person类添加一个特殊的__init__()方法,当创建实例时,__init__()方法被自动调用,我们就能在此为每个实例都统一加上以下属性:


class Person(object):
    def __init__(self, name, gender, birth):
        self.name = name
        self.gender = gender
        self.birth = birth

__init__() 方法的第一个参数必须是 self(也可以用别的名字,但建议使用习惯用法),后续参数则可以自由指定,和定义函数没有任何区别。


相应地,创建实例时,就必须要提供除 self 以外的参数:

有了__init__()方法,每个Person实例在创建时,都会有 name、gender 和 birth 这3个属性,并且,被赋予不同的属性值,访问属性使用

访问限制:Python对属性权限的控制是通过属性名来实现的,如果一个属性由双下划线开头(__),该属性就无法被外部访问。

如果一个属性以"__xxx__"的形式定义,那它又可以被外部访问了,以"__xxx__"定义的属性在Python的类中被称为特殊属性,有很多预定义的特殊属性可以使用,通常我们不要把普通属性用"__xxx__"定义。

打印"__xx"时会返回“AttributeError”错误

class Person(object):
    address = ‘Earth‘
    def __init__(self, name):
        self.name = name

p1 = Person(‘Bob‘)
p2 = Person(‘Alice‘)

print ‘Person.address = ‘ + Person.address

p1.address = ‘China‘
print ‘p1.address = ‘ + p1.address

print ‘Person.address = ‘ + Person.address
print ‘p2.address = ‘ + p2.address

结果如下:

Person.address = Earth
p1.address = China
Person.address = Earth
p2.address = Earth

 p1.address = ‘China‘并没有改变 Person 的 address,而是给 p1这个实例绑定了实例属性address ,对p1来说,它有一个实例属性address(值是‘China‘),而它所属的类Person也有一个类属性address

访问 p1.address ,优先查找实例属性,返回‘China‘。

访问 p2.address ,p2没有实例属性address,但是有类属性address,因此返回‘Earth‘。

可见,当实例属性和类属性重名时,实例属性优先级高,它将屏蔽掉对类属性的访问。

当我们把 p1 的 address 实例属性删除后,访问 p1.address 就又返回类属性的值 ‘Earth‘了:

del p1.address
print p1.address
# => Earth

可见,千万不要在实例上修改类属性,它实际上并没有修改类属性,而是给实例绑定了一个实例属性。

定义一个类方法:

class中定义的全部是实例方法,实例方法第一个参数 self 是实例本身。

要在class中定义类方法,需要这么写:

class Person(object):
    count = 0
    @classmethod
    def how_many(cls):
        return cls.count
    def __init__(self, name):
        self.name = name
        Person.count = Person.count + 1

print Person.how_many()
p1 = Person(‘Bob‘)
print Person.how_many()

通过标记一个 @classmethod,该方法将绑定到 Person 类上,而非类的实例。类方法的第一个参数将传入类本身,通常将参数名命名为 cls,上面的 cls.count 实际上相当于 Person.count

因为是在类上调用,而非实例上调用,因此类方法无法获得任何实例变量,只能获得类的引用。

如果将类属性 xxx 改为私有属性__xxx,则外部无法读取__xxx,但可以通过一个类方法获取,请编写类方法获得__xxx值。

 

时间: 2024-10-30 14:25:15

模块与类的相关文章

一步一步学会puppet(二)--模块和类

上一篇主要介绍了puppet的基本工作原理和资源的相关初步使用: 这一篇主要介绍puppet中很重要的2个概念:模块和类: =================================================================== 1 模块 1.1 需求 1.2 定义 1.3 详细说明 1.4 模块的目录组织结构 1.5 模块管理 2 类 2.1 定义 2.2 详细说明 2.3 类的分类 2.4 类的声明 2.5 实例 ========================

js模块,类,继承,命名空间,私有属性等相关概念梳理

js确切的说是一种基于对象的语言,和纯面向对象的语言(比如as)稍微有点区别,js中没有类的概念.虽然有继承但是基于原型的继承.随着前段越来越受重视,jser们利用js的一些特性他们制造出了和纯面向对象一样好玩的东西.下面就js中一些概念进行概述,很多东西都是来自博客园的一些大牛,我写这篇文章主要想拿as和js做对比来讲,以方便as像转js的程序员们.本片文章涉及的概念有,模块,类,继承,私有属性和公开属性. 1.模块大家写as的时候都知道,as里面是有类的概念,每次生成一个类,系统中都会多一个

【P000-009】分析模块——四大类

仅仅将分析模块按实际惯例简单分成价值和价格两类看来并不准确.一家公司便宜绝对不等于能赚钱,公司所对应的股票也不会因为公司现在赚钱(亏钱)就一定涨(跌),当然长期来看,股票价格运行是与公司效益成正比的.也就是俗话说 (短期)市场的错误,和(长期)市场的正确. 不过这个展开来说又复杂了,抽象建模要的就是化繁为简,先打住. 公司战略,市场环境,投资倾向什么的全部屏蔽,我们现在要的只是一些数据 一.这些数据按来源可以分为两个部分 1.来自于公司 2.来自于(二级)市场(交易市场) 二.而按照时间连续性也

模块和类的通用转换规则(2),如何oo?

介绍模块和类怎么互相转换,不谈面向对象的继承 封装 多态等特点. 一个person_module模块,有人的基本属性和功能. person_module.py如下 # coding=utf8 name = '小明' eye_color = 'blue' age = 10 def get_eye_color(): return name + '的眼睛颜色是: ' + eye_color def show_age(): print name + '的年龄是: ' + str(age) def gro

模块、类和对象(python学习笔记)

模块.类和对象 1.字典,记住键值对的概念,记住从键值对 mystuff = {'apple':"I am apples"} print mystuff['apple'] 2.模块 ''' 模块 1.模块是包含函数和变量的文件 2.模块这个文件可以被导入 3.可以使用.操作符访问模块中的函数和变量 ''' #模块代码示例 #以下是一个模块,名字叫mystuff.py # this goes in mustuff.py def apple(): print("I am a ap

python附录-builtins.py模块str类源码(含str官方文档链接)

python附录-builtins.py模块str类源码 str官方文档链接:https://docs.python.org/3/library/stdtypes.html#text-sequence-type-str builtins.py class str(object): """ str(object='') -> str str(bytes_or_buffer[, encoding[, errors]]) -> str Create a new stri

【Python基础】lpthw - Exercise 40 模块、类和对象

一. 模块(module) 模块中包含一些函数和变量,在其他程序中使用该模块的内容时,需要先将模块import进去,再使用.操作符获取函数或变量,如 1 # This goes in mystuff.py 2 def apple(): 3 print("This is an apple.") 4 5 pear = "This is a pear." 1 import mystuff as ms 2 ms.apple() 3 4 print(ms.pear) 输出为

PHP输出当前进程所有变量 / 常量 / 模块 / 函数 / 类

<?php /* 不知道怎么打印某个函数的参数和相关分类类型的所有函数 以下函数如果没有参数,返回的都是一个数组 get_defined_vars() 获取所有已经定义的变量 get_defined_constants() 获取所有已经定义的常量 get_defined_functions() 获取所有已经定义的函数 get_loaded_extensions() 获取所可用模块 get_extension_funcs() 获取指定模块的可用函数 get_declared_classes() 获

VBA类模块--添加类的函数(2)

为CTable类添加一个Create方法,代码就变成下面这个样子了 CTable 类模块: 1 Option Explicit 2 3 '==================================== 4 '名称: CTable 5 '功能: 描述一个Excel表格区域 6 '==================================== 7 8 9 '类的属性 10 Public strName As String ' 表名 11 Public strAddress As

第四章输入/输出(I/O)4.2PCL中I/O模块及类介绍

PCL中I/O库提供了点云文件输入输出相关的操作类,并封装了OpenNI兼容的设备源数据获取接口,可直接从众多感知设备获取点云图像等数据.I/O模块利用21个类和28个函数实现了对点云的获取.读入.存储等相关操作,其依赖于pcl_common和pcl_octree模块以及OpenNI外部开发包. 1)I/O模块中类以及全局函数说明