URN Logo
UNIX Resources » Linux » China Linux Forum » Python 编 程 » 4 » 关于类、对象的问题
announcement 声明: 本页内容为中国Linux论坛的内容镜像,文章的版权以及其他所有的相关权利属于中国Linux论坛和相应文章的作者,如果转载,请注明文章来源及相关版权信息。
Resources
China Linux Forum(finished)
Linux Forum(finished)
FreeBSD China(finished)
linuxforum.net
  业界新闻与评论
  自由软件杂谈
  IT 人生
  Linux软件快递
  翻译作坊
  Linux图书与评论
  GNU Emacs/XEmacs
  Linux 中文环境和中文化
  Linux桌面与办公软件
  Linux 多媒体与娱乐版
  自由之窗Mozilla
  笔记本电脑上的Linux
  Gentoo
  Debian 一族
  网络管理技术
  Linux 安装与入门
  WEB服务器和FTP服务器
  域名服务器和邮件服务器
  Linux防火墙和代理服务器应用
  文件及打印服务器
  技术培训与认证
  Linux内核技术
  Linux 嵌入技术
  Linux设备驱动程序
  Linux 集群技术
  LINUX平台数据库
  系统和网络安全
  CPU 与 编译器
  系统计算研究所专栏
  Linux下的GUI软件开发
  C/C++编程版
  PHP 技 术
  Java&jsp技术
  Shell编程技术
  Perl 编 程
  Python 编 程
  XML/Web Service 技术
  永远的Unix
  FreeBSD世界
   
关于类、对象的问题
关于类、对象的问题 - printme [2005-11-28 15:55 | 789 byte(s)]
 
Re: 关于类、对象的问题 - jsonic [2006-01-16 14:58 | 306 byte(s)]
 
Re: 关于类、对象的问题 - limodou [2005-11-28 21:33 | 1,941 byte(s)]
 
Re: 关于类、对象的问题 - printme [2005-11-29 10:40 | 552 byte(s)]
 
Re: 关于类、对象的问题 - limodou [2005-11-29 16:03 | 1,553 byte(s)]
 
Re: 关于类、对象的问题 - printme [2005-11-29 16:38 | 91 byte(s)]
 
Re: 关于类、对象的问题 - limodou [2005-11-29 16:41 | 20 byte(s)]
 
Re: 关于类、对象的问题 - printme [2005-11-29 18:36 | 6 byte(s)]
 
Re: 关于类、对象的问题 - printme [2005-11-28 22:26 | 274 byte(s)]
 
Re: 关于类、对象的问题 - limodou [2005-11-29 09:07 | 517 byte(s)]
 
Subject: 关于类、对象的问题
Author: printme    Posted: 2005-11-28 15:55    Length: 789 byte(s)
[Original] [Print] [Top]

#!/usr/bin/python
# Filename: class_init.py

class Person:
def __init__(self, name):
self.name = name
def sayHi(self):
print 'Hello, my name is', self.name

p = Person('Swaroop')
p.sayHi()

# This short example can also be written as Person('Swaroop').sayHi()
----------------------------------------------------------

这段代码中有地方理解不了
“p = Person('Swaroop')”是不是表示建立了一个新的对象实例?
那后边括号里的“Swaroop”是什么呢?怎么跟域对应上的呢?
self.name 不是表示类Perso的一个方法_init_中的域吗?
二者(“Swaroop”和“self.name”)有什么联系?
----
从零开始,不过难了点
[Original] [Print] [Top]
Subject: Re: 关于类、对象的问题
Author: limodou    Posted: 2005-11-28 21:33    Length: 1,941 byte(s)
[Original] [Print] [Top]
python代码有缩近,因此在本论坛张贴时还请看顶层的贴子关如何张贴代码的说明。谢谢合作。一行不要太长,特别是中文。

p = Person('Swaroop')

是创建了一个实例。实例是与类相区别的。类是一类实例(或对象)的抽象,而实例是类的具体化。一般我们操作都使用实例。将类实例化的过程称之创建对象。如:汽车是类,是一个概念,是一个统称。而你的汽车,我的汽车则是实际存在的东西。它们具有汽车的共同属性,也可以拥有不同的属性。如不同的颜色,不同的车牌号码等等。因此实例是不同的东西,即使是从一个类产生出来的,也可以是不同的。

从一个类创建一个实例一般需要一个初始化的过程。在C++/java中一般都有一个构造函数,它们完成类的实例化过程,即分配内存空间,给实例的属性赋初值等。在构造函数中可以输入一些参数,这样实例在生成的同时就可以拥有不同的属性。但python的实例创建有所不同。python是先创建实例,然后再执行类中的__init__(self)方法。也就是在执行__init__(self)的时候,类的实例已经创建完毕了。而c++/java则是执行完构造函数之后才真正创建实例。

p = Person('Swaroop')

在python处理时,实例上是自动转换为:

p = Person.__init__(self, 'swaroop')

但__init__的这样转换是自动完成的。self就是创建出来的实例对象,Python会将其作为类方法的第一个参数传递进去。'swaroop'则是__init__ 的参数。因此上面的语句用语言表示就是:创建一个Persion实例,指定了一个'Swaroop'的参数。

self.name = name

因为self是实例对象。self.name=name表示给实例的属性'name'属值。如果对一个不存在的实例属性赋值时,这时python会自动地为实例对象增加一个属性。因此,这种方法就是向实例增加属性的一种方法。通过这个赋值语句,这样就可以在创建实例的同时,向这个新的实例(对象)生成一个新的属性,属性值为name,即构造实例时传入的name参数的值。这个值随着构造时传入的值不同,会生成具有不同属性的不同实例。在执行完 p = Person('Swaroop')之后,实例p的name属性值即为p.name='Swaroop'了。

这些都是基本的东西,一定要弄清楚,如果不明白先多看几篇教程,然后再提问。
----
[Original] [Print] [Top]
Subject: Re: 关于类、对象的问题
Author: printme    Posted: 2005-11-28 22:26    Length: 274 byte(s)
[Original] [Print] [Top]
呵呵,好像每次提问limodou都会认真地回答,向你致敬!
张贴代码说明一会就看。
教程其实我看了好几遍了,还看过不同版本的教程呢,还不清楚,甚至都对自己产生了怀疑,是不是学不了编程了(其实我不能说聪明但也不笨啊).......
limodou写了这么多,我得仔细吸收下.
----
从零开始,不过难了点
[Original] [Print] [Top]
Subject: Re: 关于类、对象的问题
Author: limodou    Posted: 2005-11-29 09:07    Length: 517 byte(s)
[Original] [Print] [Top]
呵呵。面向对象是一个很重要的概念,一旦你理解,并且可以体会到不同面向对象语言之间的差别,使用起来会得心应手。而且在 python 中,利用面向对象的技术有非常多的花样可以玩的。在你掌握之后,我可以向你介绍一些高深的面向对象的用法。

但目前你主要应该把基本概念搞清楚。比如区分类,对象,实例,属性,类方法,派生,继承,重载,覆盖, this, self,多重继承,单根继承,钻石问题等概念,这里有些是 python 用到的,有些是其它面向对象语言的。有些是相对难懂的概念,有些是简单的。看情况掌握,但至少教程上的例子应该可以看懂。
----
[Original] [Print] [Top]
Subject: Re: 关于类、对象的问题
Author: printme    Posted: 2005-11-29 10:40    Length: 552 byte(s)
[Original] [Print] [Top]
还有这么多要学的...
“self.name=name”的目的不是给属性赋值,而是加入name属性是吗?
sele是实例对象,那我可不可以将self.name=name看成“person._init_.name(呵呵,有这么写的吗?)”
Swaroop是实例p的一个参数怎么跟属性对应上了(p.name='Swaroop')?这一点特别迷糊。根据limodou的解释我说下我的理解,limodou帮我看看对不对。p = Person("Swaroop")就把参数“Swaroop”赋给了类方法_init_中的name参数,相当于实例变成Person._init_(self,Swaroop),所以在执行self.name的时候根据self.name=name,得出self.name='Swaroop'即p.name='Swaroop'
----
从零开始,不过难了点
[Original] [Print] [Top]
Subject: Re: 关于类、对象的问题
Author: limodou    Posted: 2005-11-29 16:03    Length: 1,553 byte(s)
[Original] [Print] [Top]
>self.name=name”的目的不是给属性赋值,而是加入name属性是吗?

如果已经有了name属性,就是改值。如果没有则创建一个新的。

>sele是实例对象,那我可不可以将self.name=name看成“person._init_.name(呵呵,有这么写的吗?)”

不行。Person.__init__是方法,不是属性。另外单词拼写要正确。sele应为self,_init_应为__init__。是双下划线,错一点都不行。

>Swaroop是实例p的一个参数怎么跟属性对应上了(p.name='Swaroop')?这一点特别迷糊。根据limodou的解释我说下我的理解,limodou帮我看看对不对。p = Person("Swaroop")就把参数“Swaroop”赋给了类方法_init_中的name参数,相当于实例变成Person._init_ (self,Swaroop),所以在执行self.name的时候根据self.name=name,得出self.name='Swaroop'即 p.name='Swaroop'

每个实例创建完都会给它一个变量,以便使用。p = Person('Swaroop') 这样创建了一个实例,这个实例的变量是p。那么在创建时做了什么呢? Person('Swaroop') 你已经知道了,是转为了:
Person.__init__(self,'Swaroop')

那么这个self是什么,此时因为还没有与p进行绑定(就是将新创建的实例起一个名字),因此只能使用self来调用。我前面说过python是先创建实例,再执行的__init__方法,因此创建完的实例还没有名字,但可以通过类方法的第一个参数来使用,通常就是self。在__init__中实现了向self实例绑定一个name属性,并且它的值为'Swaroop'。这一切做完了之后,返回了这个创建的实例self,然后执行p = self(可以这么理解)。这样p就变成了新创建的实例了。所以通过p就可以访问新创建的实例的所有东西。而self则只是一个临时的东西,它只是一个参数。真正的实例最后有一个名字p。
----
[Original] [Print] [Top]
Subject: Re: 关于类、对象的问题
Author: printme    Posted: 2005-11-29 16:38    Length: 91 byte(s)
[Original] [Print] [Top]
这么仔细地解释(幸好我这种人少),石头也懂了,哈哈哈
全部收下,严重感谢limodou!!
----
从零开始,不过难了点
[Original] [Print] [Top]
Subject: Re: 关于类、对象的问题
Author: limodou    Posted: 2005-11-29 16:41    Length: 20 byte(s)
[Original] [Print] [Top]
不用客气。多体会吧。
----
[Original] [Print] [Top]
Subject: Re: 关于类、对象的问题
Author: printme    Posted: 2005-11-29 18:36    Length: 6 byte(s)
[Original] [Print] [Top]
收到!
----
从零开始,不过难了点
[Original] [Print] [Top]
Subject: Re: 关于类、对象的问题
Author: jsonic    Posted: 2006-01-16 14:58    Length: 306 byte(s)
[Original] [Print] [Top]
简明 Python 教程(绝对好的python启蒙读物)
http://www.byteofpython.info/language/chinese/index.html

耐心地,仔细地看完以上这本书,这样的问题就会少的多.
----
坚持开源路线百年不变
http://blog.go.6600.org
[Original] [Print] [Top]
« Previous thread
道语言最新版本0.9.6beta发布!
Python 编 程
4
Next thread »
pydoc tut里的一段话。 implementation of method不太明白。
     

Copyright © 2007 UNIX Resources Network, All Rights Reserved.      About URN | Privacy & Legal | Help | Contact us
备案序号: 京ICP备05006143    webmaster: webmaster@unixresources.net
This page created on 2008-07-17 04:10:58, cost 0.086910963058472 ms.