着实被"dive into python"和"python简明教程"中对类的属性的介绍弄晕了,在经过了若干小时痛苦的想象和实践后,终于略有小成,写文一篇,帮助大家解惑.
我的环境是python2.5
知识准备
可以看这个连接先:
http://www.python.org/doc/current/tut/node11.html#SECTION0011600000000000000000
python中的类叫 class object,类的实例叫instance object.
类 Class Objects
类拥有两种操作,1.类属性 attribute references 2.实例化instantiation
类属性就相当于专属于一个类的变量(即某些语言中的类的静态公共变量static public),使用方法是:类名称.类属性名称
实例化则是创建一个类的实例的方法,使用方法是:类名称()
在使用实例化方法后,将会创建一个空的类实例,一般的python类的定义中会有一个特殊的方法来初始化,这个方法就是__init__(),当调用了类的实例化方法后,__init__()方法会立刻被这个类的实例调用.也就是说,__init__()不是构造函数,而是一个普通的方法.
类的实例 Instance Objects
类的实例只拥有一种操作,这就是 1.属性调用 attribute references.
属性调用指 1.数据属性 2.方法
数据属性
数据属性不需要预先定义!当数据属性初次被使用时,它即被创建并赋值(they spring into existence when they are first assigned to)
看下面的例子
class Test:
pass
t=Test()
t.name='notus'
print t.name
我们在类Test中并没有定义name这个数据属性,但是在代码中却可以直接使用,这就是数据属性.
方法
这个暂且不议.
如何定义类的属性
现在,抛开广义上对属性attribute的解释,在实际编程中经常用的属性这个词,在python的class中有两种属性:类属性,数据属性.(大多数编程语言都有这样两种属性).类属性属于类,数据属性属于类的实例.我们假设有类Test,则一般这两种属性的用法是
Test.mode
t=Test()
t.name
那么这两种属性应该在什么时候定义呢?
按照上面的讨论可知,数据属性不需要预先定义,当数据属性初次被使用时,它即被创建并赋值.而实际上,类属性也是如此.
因此,我们有了下面的例子
class Test:
pass
t=Test()
t.name='notus'
print t.name
Test.mode='auto'
print Test.mode
大家看,数据属性name和类属性mode均没有在类中被定义,你要做的,只是在需要的时候使用他们即可.
如何预先给属性赋值
可以在类的定义中使用属性,先看这个例子
class Test:
def ask(theInstance):
theInstance.name='notus'
Test.mode='auto'
##print Test.mode
t=Test()
##print t.name
t.ask()
print Test.mode
print t.name
类Test有方法ask.注意看程序中被注释掉的两行,在没有使用ask()方法前,运行被注释的那两句的任一句均会出错,提示"class Test has no attribute ...".但运行ask()后,我们在ask()方法中初始了这两个属性
,则运行通过.
注意看ask()接收的参数theInstance,这个传过来的就是程序中类Test的实例t
.一般的命名规范建议将这个参数命名为self.这个参数是python自动传入的,所以不需要再在程序中传.
如果想要在类实例化后立刻使用这些属性,那就应该把这些属性的初始放在__init__()方法中,前面说过了,__init__()方法在类的实例化结束后立刻被自动调用.
所以我们的例子程序可以改成这样
class Test:
def __init__(self):
self.name='notus'
Test.mode='auto'
##print Test.mode
t=Test()
##print t.name
print Test.mode
print t.name
所以可以有这样的类定义
class Test:
def __init__(self):
self.name='notus'
Test.mode='auto'
def ask(self):
self.date='2008'
##print Test.mode
t=Test()
##print t.name
print Test.mode
print t.name
##print t.date
t.ask()
print t.date
数据属性date只有在调用了ask()方法后才可以被使用.当然这样也可以使用这个属性
##print Test.mode
t=Test()
##print t.name
print Test.mode
print t.name
t.date='2007'
print t.date
在程序中创建了date这个数据属性.可以想象,之后调用ask()方法时,数据属性date已经存在,只是被改变了值.
不用方法也可以初始化属性
看下面的示例程序
class Test:
action='win the game'
print Test.action
t=Test()
print t.action
Test.action='at least 1 point'
print Test.action
print t.action
t.action='dont lose'
print Test.action
print t.action
运行的结果如下
win the game
win the game
at least 1 point
at least 1 point
at least 1 point
dont lose
现象可以概括为:"改变类属性,数据属性跟着变,改变数据属性,类属性不变".其中的原理,因为不明白,所以不乱说了.高人来解释下 :)
对该问题的解释:
http://hi.baidu.com/newtype/blog/item/7dc86d22899b1fa04723e8d0.html
希望本文可以给迷糊的朋友以帮助.
Org: http://hi.baidu.com/newtype/blog/item/03b355fb626071126c22eb1a.html
相关推荐
类(Class)是Python中创建自定义对象的主要方式,它允许我们定义新的数据类型,封装数据和行为。 类是一种定义对象模板的方式,通过类我们可以创建具有特定属性(data attributes)和方法(methods)的对象实例。...
例如,为类添加一个类属性:`class MyClass: class_attribute = 'value'`。 - **实例对象**:类的实例是实际的对象,可以通过类名来创建。例如,创建一个类的实例:`instance = MyClass()`。 - **方法对象**:类的...
在本次小作业中,我们定义了一个类 `Today`,包含一个对象属性 `_data`,一个静态方法 `static_method`,一个类方法 `class_method`,以及一个委托属性 `data`: ``` class Today: def __init__(self): self._data...
- **导入特定属性**: 可以使用`from module import attribute`来直接导入模块中的特定属性。 - **导入多个属性**: 使用逗号分隔多个属性,如`from module import attr1, attr2`。 - **导入所有属性**: 使用`from ...
在Python中,类是通过`class`关键字定义的。让我们深入了解一下Python类的基本要素和如何使用它们。 1. **类的定义** - 使用 `class` 关键字开始定义一个类,后跟类名,通常首字母大写,如 `ClassName`。类名应...
PEP 520: Preserving Class Attribute Definition Order PEP 468: Preserving Keyword Argument Order New dict implementation PEP 523: Adding a frame evaluation API to CPython PYTHONMALLOC environment ...
类是创建对象的模板,包含属性(data members)和方法(member functions)。例如: ```python class ClassName: def __init__(self, attribute1, attribute2): self.attribute1 = attribute1 self.attribute2 = ...
Python data model: understand how special methods are the key to the consistent behavior of objects Data structures: take full advantage of built-in types, and understand the text vs bytes duality in ...
一旦动态链接库被加载,可以通过类似访问对象属性的方式获取到库中的函数。 **2.1 函数访问** ```python from ctypes import * libc = cdll.msvcrt # 假设在Windows下加载msvcrt.dll printf = libc.printf # 获取...
类是创建对象的蓝图,它定义了对象的属性(data attributes)和方法(methods)。 - **对象**:通过类实例化得到的就是对象,每个对象都有自己的属性和方法。 2. **定义类**: - 使用`class`关键字来定义一个类,...
Python爬虫技术在数据获取和分析领域中占有重要的地位,特别是在网络信息的抓取上。本项目以"python爬取dangdang指定图书数据"为主题,利用Python的Selenium库来实现对当当网图书搜索结果的自动化浏览和数据提取。...
在Python这样的面向对象语言中,类定义了一组属性(数据成员)和方法(成员函数),这些属性描述了类的特征,方法定义了类的行为。例如,`ClassDemo.py`可能包含一个名为`Student`的类,它有属性如`name`、`age`和`...
在Python中,我们可以定义一个类来表示双链表节点,通常包括以下属性: 1. 数据(data):存储节点的实际值。 2. 前驱指针(prev):指向当前节点的前一个节点。 3. 后继指针(next):指向当前节点的后一个节点。 ...
例如,酒店名称可能在`<a>`标签的`href`属性中,价格可能在`<span>`的`data-price`属性里。 4. **处理响应**:携程网站可能会对爬虫进行反制,比如设置验证码、限制IP访问频率。这时我们需要使用`time.sleep()`进行...
调用库中的函数就像访问对象的属性一样简单。例如,`libc.printf`会获取`printf`函数的函数指针。不过,需要注意的是,如果函数不存在,尝试访问会引发AttributeError。 在调用函数时,ctypes提供了多种基本数据...
- 属性(attribute):类中定义的变量,如`self.name`。 - 方法(method):类中定义的函数,如`self.bark()`。 8. **文件操作**: - 打开文件:`file = open('filename.txt', 'r')`,模式有读('r')、写('w'...
Python Cookbook, 2nd Edition By David Ascher, Alex Martelli, Anna Ravenscroft Publisher : O'Reilly Pub Date : March 2005 ISBN : 0-596-00797-3 Pages : 844 Copyright Preface The ...
这段代码首先使用`find_element_by_id`方法定位ID为'tooltip'的元素,然后通过`.get_attribute()`方法获取这个元素的`data-original-title`属性。 获取元素的文本内容通常使用`.text`属性,例如: ```python driver...