Python是一种面向对象的脚本语言,所以它也提供了面向对象编程的所有基本特征:允许多继承的类继承机制派生类可以重写它父类的任何方法一个方法可以调用父类中同名的方法对象可以包含任意数量和类型的数据成员。关于继承,将在下一篇博文里面介绍,本文只简单的介绍Python中的类的定义和使用。

一、类定义

最简单的类的定义形式:

class ClassName:
<statement-1>
.
.
.
<statement-N>

类定义会创建一个新的命名空间,作为一个局部的作用域。在Python中,类本身就是对象,当一个类定义结束后, 一个 Class Object 就被创建。

二、类对象

类对象(Class Object)支持两种操作:属性引用实例化

属性引用

类对象的属性引用和 Python 中所有的属性引用一样,形式为:obj.name 。类对象创建后,类命名空间中所有的名字都是有效属性名,像下面这个类:

class MyClass:
"""A simple example class"""
i = 12345
def f(self):
return 'hello world'

它有一个属性 i 和 方法 f ,所以可以用MyClass.i
MyClass.f 进行属性引用,分别返回一个整数和一个函数对象。__doc__ 也是一个合法的属性,返回属于这个类的文档字符串。

实例化

类的实例化形式为:

x = MyClass()

创建了一个新的实例,并且将其指定给局部变量 x 。

在创建实例时,通常可能都需要有特定的初始状态,所以一个类可以定义一个名为 __init__()的特殊方法(构造方法):

def __init__(self):
self.data = []

当一个类定义了 __init__() 方法,类在实例化时会自动调用 __init__() 方法,用于创建新的类实例。 就像C++中的构造函数一样, __init__() 也可以有更多的参数,这时实例化提供给类的参数会传给 __init__() ,比如:

class student:
def __init__(self, n, a):
self.name = n
self.age = a stu = student('Selena', 19)
print(stu.name, stu.age) # 输出:Selena 19

三、实例对象

类对象实例化得到实例对象(Instance Object),实例对象只能进行 属性引用 这一种操作。合法的属性有两种:数据属性 和 方法。

数据属性

数据属性(data attributes)相当于C++中的数据成员,在Python中,数据属性不需要声明,当它们第一次指定时就会被引入:

class MyClass:
i = 12345
def f(self):
return 'hello world' x = MyClass()
x.counter = 1
print(x.counter)
del x.counter

注:在Python中每个值都是一个对象,可以通过object.__class__来获取对象的 class (即类型),其作用与 type() 相同。

方法

在类对象中定义的函数与普通函数只有一个特别的区别:它们的第一个参数必须是self,用以指定调用该方法的实例对象。

注意:类的方法只有被绑定到实例对象上才能够被调用。比如上面的例子中,x 是 MyClass类的一个实例对象,所以它可以直接调用 f 方法:

x.f()

为什么 f() 定义时是有一个参数的,而这里调用不需要参数呢? 因为在调用时, x 对象作为参数传递给了函数的第一个参数(即 self)。也就是说,x.f() 是严格等价于MyClass.f(x)的。

所以在多数情况下,调用一个方法(有个 n 个参数),和调用相应的函数(也有那 n 个参数,但是再额外加入一个使用该方法的对象) 是等价的。

另外,函数也可以在 class 外定义,指定该函数对象给类中的局部变量就可以了,例如:

# Function defined outside the class
def f1(self, x, y):
return min(x, y) class C:
f = f1
def g(self):
return 'hello world' c = C() # 实例化
c.f(1,3)
c.g()

四、私有成员

从C++术语上讲,Python 类的成员(包括数据成员)通常都是 public 的,并且所有的成员函数都是
virtual
的。

那么,如何在类中定义私有变量或私有方法呢?

答:在Python中规定,以两个下划线开头的名字为私有成员,不能在类的外部使用。

示例:

class A:
__str = 'python'
def __f(self):
return self.__str
def f(self):
return self.__str a = A()
a.__str # 'A' object has no attribute '__str'
a.__f() # 'A' object has no attribute '__f'
a.f() # 输出:python

附:作用域的探讨

在讲函数变量作用域时,曾经说过在一个局部作用域内重新绑定全局变量,需要使用global声明。否则,尝试给这个变量赋值,只是会简单的创建一个新的局部变量,而不会改变那个全局变量。

这里再介绍一个nonlocal语句,它用于指示,在外层的局部作用域中的变量可以在这里进行重新绑定。下面是一个例子:

def scope_test():   # 作用域测试
def do_local():
x = 'local x'
def do_nonlocal():
nonlocal x
x = 'nonlocal x'
def do_global():
global x
x = 'global x' x = 'test x' # 局部变量 do_local()
print('After do_local():', x)
do_nonlocal()
print('After do_nonlocal():', x)
do_global()
print('After do_global():', x) scope_test()
print('In global scope:', x)

可以看出,局部的赋值 do_local() 并没有改变 scope_test 绑定的 x 变量,而do_nonlocal() 则改变了 scope_test 中的 x,而do_global() 则改变了模块级别的绑定,即全局变量。

Python3基础(十) 类的初印象的更多相关文章

  1. Python3基础 A类作为B类的实例变量

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  2. Python3基础(十二) 学习总结·附PDF

    Python是一门强大的解释型.面向对象的高级程序设计语言,它优雅.简单.可移植.易扩展,可用于桌面应用.系统编程.数据库编程.网络编程.web开发.图像处理.人工智能.数学应用.文本处理等等. 在学 ...

  3. Python3基础(十一) 类的拓展

    在类的初印象中,我们已经简单的介绍了类,包括类的定义.类对象和实例对象.本文将进一步学习类的继承.迭代器.发生器等等. 一.类的继承 单继承 派生类的定义如下: class DerivedClassN ...

  4. 二十六. Python基础(26)--类的内置特殊属性和方法

    二十六. Python基础(26)--类的内置特殊属性和方法 ● 知识框架 ● 类的内置方法/魔法方法案例1: 单例设计模式 # 类的魔法方法 # 案例1: 单例设计模式 class Teacher: ...

  5. python3在使用类基础时,遇到错误TypeError: module.**init**() takes at most 2 arguments (3 given)

    python3在使用类基础时,遇到错误TypeError: module.init() takes at most 2 arguments (3 given) 1.原因:直接导入的py文件,而没有导入 ...

  6. 第二十九节:Java基础知识-类,多态,Object,数组和字符串

    前言 Java基础知识-类,多态,Object,数组和字符串,回顾,继承,类的多态性,多态,向上转型和向下转型,Object,数组,多维数组,字符串,字符串比较. 回顾 类的定义格式: [类的修饰符] ...

  7. Bootstrap<基础十六> 导航元素

    Bootstrap 提供的用于定义导航元素的一些选项.它们使用相同的标记和基类 .nav.Bootstrap 也提供了一个用于共享标记和状态的帮助器类.改变修饰的 class,可以在不同的样式间进行切 ...

  8. Bootstrap<基础十> 响应式实用工具

    Bootstrap 提供了一些辅助类,以便更快地实现对移动设备友好的开发.这些可以通过媒体查询结合大型.小型和中型设备,实现内容对设备的显示和隐藏. 需要谨慎使用这些工具,避免在同一个站点创建完全不同 ...

  9. Vue.js之初印象

    一.背景 MVVM模式,很多人在说在用,好吧,我落后了,我目前的项目木有用到MVVM模式的框架,vuejs,reactjs,angularjs,nonono,自己去捣鼓过ng,项目木有用到.实在不敢称 ...

随机推荐

  1. Code Kata:大整数四则运算—乘法 javascript实现

    上周练习了加减法,今天练习大整数的乘法运算. 采取的方式同样为竖式计算,每一位相乘后相加. 乘法函数: 异符号相乘时结果为负数,0乘任何数都为0 需要调用加法函数 因为输入输出的为字符串,需要去除字符 ...

  2. 【CImg】基本像素操作

    继openCV之后接触的又一个C++视觉库——短小精干的CImg 刚开始接触的时候真的是..几乎无从下手,网上资料比较少,但发现有一篇非常有用的中文手册:http://wenku.baidu.com/ ...

  3. N18_二叉树的镜像

    题目描述 操作给定的二叉树,将其变换为源二叉树的镜像. 输入描述: 二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ ...

  4. ThinkPHP---rbac权限管理

    [一]概论 (1)简介 rbac(role based access controal),全称基于用户组/角色的权限控制. (2)概况 目前来说,一般项目有两种权限管理方式①传统方式:②rbac方式. ...

  5. 05Oracle Database 表空间查看,创建,修改及删除

    Oracle Database 表空间查看,创建,修改及删除 查看用户表空间 查看数据库管理员表空间表结构 desc dba_tablespaces; 查询表空间名称从管理员表空间表中 select ...

  6. vuex状态管理demo

    vuex状态管理主要包含四个概念  mapState,mapMutations,mapGetters,mapActions. 编写vuex文件夹下面的store.js import Vue from ...

  7. 巧用TWaver 3D 矢量图形功能

    的确,提起TWaver,大家想到的首先是“电信拓扑图组件”.其实,由于其灵活的MVC架构.矢量化设计.方便定制等特点,TWaver可以做的还有很多.例如房地产行业常见到的“户型图”. 户型推荐是销售接 ...

  8. linux shell学习笔记二---自定义函数(定义、返回值、变量作用域)介绍

    linux shell 可以用户定义函数,然后在shell脚本中可以随便调用.下面说说它的定义方法,以及调用需要注意那些事项. 一.定义shell函数(define function) 语法: [ f ...

  9. STL二分查找函数的应用

    应用二分查找的条件必须是数组有序! 其中二分查找函数有三个binary_serch,upper_bound,lower_bound 测试数组 int n1[]={1,2,2,3,3,4,5}; int ...

  10. eclipse自动换行

    Eclipse是一款非常优秀的IDE,但是不能自动换行,需要安装一个插件完成这个功能. 安装办法有两种: 1.在线安装. 选择help-->install new software,点击Add, ...