特殊变量

  • 类似__xx,以双下划线开头的实例变量名,就变成了一个私有变量(private),只有内部可以访问,外部不能访问;
  • 类似__xx__,以双下划线开头,并且以双下划线结尾的,是特殊变量,特殊变量是可以直接访问的,它不是private变量,下面会介绍Python中的常见特殊变量;
  • 类似_x,以单下划线开头的实例变量名,这样的变量外部是可以访问的,但是,按照约定俗成的规定,当你看到这样的变量时,意思就是,“虽然我可以被访问,但是请把我视为私有变量,不要随意访问”。

内置函数

  • type(),type()函数返回type类型

用法:

import types
type('abc')==types.StringType
type(u'abc')==types.UnicodeType
type([])==types.ListType
type(str)==types.TypeType

最后这种类型叫做TypeType,所有类型本身就是TypeType。

也可以对函数或者类:

  • isinstance(),判断一个对象是否属于某个类型

一个例子:

class P(object):
pass class C(P):
pass p = P()
c = C()
print isinstance(p, P)
print isinstance(c, P)
print isinstance(p, C) # False
print isinstance(c, C)

如上,子类实例即是父类类型,也是子类类型,但父类实例不属于子类类型。

isinstance()也可以代替type()的作用:

isinstance('a', str)
isinstance(u'a', unicode)
isinstance('a', unicode) #False
  • dir(),获取对象的属性和方法列表
  • getattr(),获取对象的特定属性
  • hasattr(),对象是否存在某个属性
  • setattr(),设置对象的属性

用法:

class P(object):
name = "cq"
def __init__(self, age):
self.age = age print hasattr(P, "name") # True
print hasattr(P, "age") # False
setattr(P, "age", 31)
print getattr(P, "name") # cq
print getattr(P, "age") #

特殊变量

__doc__

定义文档字符串

__dict__

类的属性列表

__class__

__slots__

对类的实例可以动态的绑定属性和方法,如下:

from types import MethodType

def set_age(self, age):
self.age = age class P(object):
pass p = P()
p.name = 'chenqi'
p.set_age = MethodType(set_age, p, P) p.set_age(31)
print p.name
print p.age

对一个实例添加的属性(或方法)仅在该实例有效,对其它实例不起作用。

如果想让添加的方法对所有实例都生效,可以绑定到类上:

P.set_age = MethodType(set_age, None, P)

最后,__slots__的作用就是限制对类动态绑定的属性范围,例如:

class P(object):
__slots__ = ("name", "age")
pass

如上,除了"name"和"age"之外的属性就不能再增加了;

注意:__slots__属性不会继承给子类,仅在当前类生效。

__init__

创建实例的时候,可以调用__init__方法做一些初始化的工作:

class Student(object):
def __init__(self, name, score):
self.name = name
self.score = score def print_score(self):
print('%s: %s' % (self.name, self.score))

与普通的实例方法类似,如果子类不重写__init__,实例化子类时,会自动调用父类的__init__;

如果子类重写了__init__,实例化子类时,则只会调用子类的__init__,此时如果想使用父类的__init__,可以使用super函数,如下:

class P(object):
def __init__(self, name, score):
self.name = name
self.score = name class C(P):
def __init__(self, name, score, age):
super(C, self).__init__(name, score)
self.age = age c = C('cq', 100, 31)

__new__

注意:__init__是实例创建之后调用的第一个方法,而__new__更像构造函数,它在__init__之前被调用。

另外,__new__方法是一个静态方法,第一参数是cls,__new__方法必须返回创建出来的实例。

例如,用__new__实现单例模式:

class Singleton(object):
def __new__(cls):
# 关键在于这,每一次实例化的时候,我们都只会返回这同一个instance对象
if not hasattr(cls, 'instance'):
cls.instance = super(Singleton, cls).__new__(cls)
return cls.instance obj1 = Singleton()
obj2 = Singleton() obj1.attr1 = 'value1'
print obj1.attr1, obj2.attr1
print obj1 is obj2

__del__

类似析构函数。

class NewClass(object):
num_count = 0 def __init__(self,name):
self.name = name
self.__class__.num_count += 1
print name,NewClass.num_count def __del__(self):
self.__class__.num_count -= 1
print "Del",self.name,self.__class__.num_count a = NewClass("a")
b = NewClass("b")
c = NewClass("c") del a
del b
del c

注意:用del删除一个对象的时候,不一定会调用__del__,只有在对象的引用计数为零时,__del__()才会被执行。

__enter__

__exit__

这两个方法是用于支持with语句的上下文管理器。

例如让文件句柄支持with语法的实现:

class File(object):
def __init__(self, file_name, method):
self.file_obj = open(file_name, method)
def __enter__(self):
return self.file_obj
def __exit__(self, type, value, traceback):
self.file_obj.close() with File('demo.txt', 'w') as opened_file:
opened_file.write('Hola!')

__iter__

next

如果一个类想被用于for ... in循环,类似list或tuple那样,就必须实现一个__iter__()方法,该方法返回一个迭代对象,然后,Python的for循环就会不断调用该迭代对象的next()方法拿到循环的下一个值,直到遇到StopIteration错误时退出循环。

class Fib(object):
def __init__(self):
self.a, self.b = 0, 1 # 初始化两个计数器a,b def __iter__(self):
return self # 实例本身就是迭代对象,故返回自己 def next(self):
self.a, self.b = self.b, self.a + self.b # 计算下一个值
if self.a > 100000: # 退出循环的条件
raise StopIteration();
return self.a # 返回下一个值

__call__

实例可以像函数一样调用。

class Student(object):

    def __init__(self):
self.name = "Michael" def __call__(self):
print '__call__ called' s = Student()
s()

注意:callable()函数可用于判断一个对象是否可调用!

__str__,返回用户看到的字符串

__repr__,返回开发者看到的字符串(用于调试)

# test.py
class P(object):
def __str__(self):
return "__str__ called" def __repr__(self):
return "__repr__ called" p = P()

可以看下__str__和__repr__的区别:

>>> from test import p
>>> p
__repr__ called
>>> print p
__str__ called

__getitem__

__setitem__

__delitem__

支持下标(或切片)操作的函数,

例如:

class Fib(object):
def __getitem__(self, n):
if isinstance(n, int):
a, b = 1, 1
for x in range(n):
a, b = b, a + b
return a
if isinstance(n, slice):
start = n.start
stop = n.stop
a, b = 1, 1
L = []
for x in range(stop):
if x >= start:
L.append(a)
a, b = b, a + b
return L fib = Fib()
print fib[10]
print fib[0:10]

__getattr__

__getattribute__

__setattr__

__delattr__

支持点操作(即 "对象.属性" 访问方式),

当访问不存在的属性时,才会使用__getattr__  方法.

class Student(object):

    def __init__(self):
self.name = "Michael" def __getattr__(self, attr):
print '__getattr__ called'
if attr=='score':
return 99
elif attr=='name':
return "Tom" s = Student()
print s.score #
print s.name # Michael

Python的字典支持下标操作,但不支持 "." 操作,如果想让其支持,如下实现:

class Storage(dict):
__slots__ = ()
"""
A Storage object is like a dictionary except `obj.foo` can be used
in addition to `obj['foo']`. >>> o = Storage(a=1)
>>> o.a
1
>>> o['a']
1
>>> o.a = 2
>>> o['a']
2
>>> del o.a
>>> o.a
Traceback (most recent call last):
...
AttributeError: 'a'
>>> 'b' in o
False """ def __getattr__(self, key):
try:
return self[key]
except KeyError, k:
raise AttributeError(k) def __setattr__(self, key, value):
self[key] = value def __delattr__(self, key):
try:
del self[key]
except KeyError, k:
raise AttributeError(k) def __repr__(self):
return '<Storage ' + dict.__repr__(self) + '>'

参考文档:

https://infohost.nmt.edu/tcc/help/pubs/python/web/special-methods.html

Python中类的特殊变量的更多相关文章

  1. python中类的定义、实例化、封装以及私有变量/方法

    1.  定义类 python中定义一个类的格式如下: class MyClass(object): def __init__(self,data1,data2): self.__data1=data1 ...

  2. python中类中属性和方法的具体定义方法和使用

    1. Python中类中特性分成属性和方法 属性和方法都分为私有和公有的,私有的只可以在本类中使用外部是无法访问的 2. 定义属性(成员变量)的语法格式(公有属性/私有属性) class 类名: de ...

  3. Python中类的属性的访问控制

    因为自己是做.NET的,之前有学习过Python,喜欢这门语言的很多特性,最近又不时看了一会儿,将自己的感受分享给大家,其中也难免会用C#的角度看Python的语法,主要还是讲下Python中类中对属 ...

  4. 第7.6节 Python中类的继承机制详述

    在本章第一节,介绍了面向对象程序设计的三个特征:封装.继承和多态,前面章节重点介绍了封装和多态,由于Python语言是多态语言,对象的类型不再由继承等方式决定,而由实际运行时所表现出的具体行为来决定, ...

  5. Python中类的相关介绍

    本文主要介绍python中类的概念性内容,如类的定义.说明及简单使用 1. 类的简单介绍 1 # -*- coding:utf-8 -*- 2 # Author:Wong Du 3 4 ''' 5 - ...

  6. Python 类变量和成员变量

    Python 类变量和成员变量 类与对象的方法 我们已经讨论了类与对象的功能部分,现在我们来看一下它的数据部分.事实上,它们只是与类和对象的名称空间 绑定 的普通变量,即这些名称只在这些类与对象的前提 ...

  7. python中类的继承

    python中类的继承 在python中面向对象编程中实现继承,以下面一个实例进行说明. class SchoolMenber(): # __init__类似于c++中的构造函数 # __init__ ...

  8. python学习第二天 --变量及其字符串

    python变量: 在计算机程序中,变量不仅可以是数字,还可以是任意数据类型. 在Python程序中,变量是用一个变量名表示,变量名必须是大小写英文.数字和下划线(_)的组合,且不能用数字开头. 在P ...

  9. python安装和环境变量的配置

    python安装和环境变量的配置 研究生阶段学习的需求,简单的学习了python的语法和基础之后产生了兴趣,有了想从基础把python学好用好的想法.因此在忙碌的学习中抽出时间,在每天花几个小时学习p ...

随机推荐

  1. Java基础之理解Annotation

    一.概念 Annontation是Java5开始引入的新特征.中文名称一般叫注解.它提供了一种安全的类似注释的机制,用来将任何的信息或元数据(metadata)与程序元素(类.方法.成员变量等)进行关 ...

  2. 网站SSL证书在线检测

    网站SSL证书在线检测 http://web.chacuo.net/netsslcheck OpenSSL命令行工具的证书操作 http://blog.csdn.net/a351945755/arti ...

  3. Dll注入经典方法完整版

    总结一下基本的注入过程,分注入和卸载 注入Dll: 1,OpenProcess获得要注入进程的句柄 2,VirtualAllocEx在远程进程中开辟出一段内存,长度为strlen(dllname)+1 ...

  4. C#编程(八十三)---------- 程序集的含义

    程序集的含义 一.程序集是包含一个或多个类型定义文件和资源文件的集合.它允许我们分析可重用类型的逻辑表示和物理表示. 相当于你定义了一个项目XXProject,项目存在很多文件(类,窗体,接口,资源等 ...

  5. opencv rtsp 人脸识别

    import cv2 import dlibimport jsonface_detector = dlib.get_frontal_face_detector() cap = cv2.VideoCap ...

  6. verilog语法实例学习(12)

    verilog中的综合和不可综合总结 Verilog中综合的概念 综合就是EDA工具或者说综合工具把我们编写的verilog代码转化成具体电路的过程.Verilog中有很多语法,结构,过程,语句,有些 ...

  7. python Image resize 对iOS图片素材进行2X,3X处理

    通常在iOS上开发使用的图片素材1x,2x,3x三种 下面利用python Image 库 resize函数,由一个大图,自动生成1x,2x,3x的素材照片: 1. 首先你的python环境要安装有I ...

  8. M1 卡技术规范

    射频卡简单来讲就是卡的一种工作方式,通过感应的方式来工作,也能够把全部的感应卡都统称为射频卡. IC卡的范围比較广.芯片外露的接触式IC卡.芯片内置的感应式IC卡和双界面IC卡都可统称为IC卡.IC卡 ...

  9. 启动apache (OS 10022)提供了一个无效的參数。解决方式

    今天 apache 突然启动不起来了,查看了一下错误日志发现了例如以下错误: [Tue Mar 17 11:27:32 2015] [crit] Parent: child process exite ...

  10. ios实例开发精品源码文章推荐(8.22)

    1.iOS源码:简单阅读器 http://www.apkbus.com/android-112176-1-1.html 2.iOS源码:音频声效--Audio Streamer<ignore_j ...