python类之间的相互调用

guzl86 2009-03-19 10:58:10
python类之间是怎么相互调用的
我怎么样将类组织到一起来使用呢?
...全文
14998 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
oasistree 2009-03-21
  • 打赏
  • 举报
回复
  我昨天没看到3楼,有一个问题先,你在b类中实例化a想干什么,是做为它的属性呢,还是要在方法中作一个操作?前者好说,我的例子隐含的说明了,我待会在举个更清楚的。后者的话,你是不是在想C++中的指针,想指到那去省性能。这还得看你的方法是干什么的,你可以专门订一个方法用来返回那个实例,不用担心性能的问题(不用再实例化)。Python的指针"under the hood"。 如果你的方法是一个作了某个操作的,其中有实例化a,本来不用返回的。一种情况是你可以为了C的应用在专门加一个返回值,然后在C中调用,一样的不用担心性能的问题。Python不用向C++那样考虑问题。如果你的这部分应用真的speed critical的话,用C++重写函数,打包后用Python调用,这本来就是Python的一个特点么。
  我在举个做属性的例子,这些东西只要传递了,就不用担心实例化的问题,除非本身就是新生成的.

class A(object): # python的类一般大写
def __init__(self,attri = "总得放点什么"):
self.__attri = attri
def method(self):
print("总得做点什么")

class B(object):
def __init__(self,attri):
self.__attri = attri # 准备在应用中将A的实例传给此
def __str__(self):
rep = "class B object"
return rep
def methond(self):
print("也做点什么吧")
@property
def attri(self):
return self.__attri

class C(object):
def __init__(self):
pass
def method(self,inData):
# 准备用此方法调用B的属性,在应用中就可能捕获A的实例,
# 如果A在B中被实例化了的话
temp = inData
print(temp)
#return temp #如果需要的话,这样可以将A的实例一直传下去,Python会自动管理内存(指针)

# 应用实例
a = A()
b = B(a) # 将A的实例传给B的属性
c = C()

c.method(b.attri) # 通过B的属性调用到了A的实例


还有一个问题,你原来用的什么语言?如果还没回答你的问题的话,是不是把你的问题描述的更详细点,最好加上代码,其中加上注释和你想做的事。
oasistree 2009-03-20
  • 打赏
  • 举报
回复
不知楼主什么意思,我的理解和4楼不一样。
属性(成员变量)一般私有通过设置Properties或通过对方类的方法调用。Properties有老方法和新方法,建议用新方法property decorator。至于对方类的方法,就是通过对方类调用呀。我举个例子吧:

"""Jerry Cool's demo for friend."""
#!/usr/bin/env python
# -*- coding: cp936 -*-

class Me(object):
"""这就是我啦。
"""
def __init__(self,weapon = gun): # gun 可能是基本类型,也可能是一个类
self.__weapon = weapon # 私有成员变量
def fireAt(self,enemy):
"""向敌人发起攻击,敌人根据被攻击武器种类失血。
这里通过调用对方类的方法实现。我看得教材里说'看起来直接通过对方类来
调用它的方法很不礼貌,但是这要比直接调用对方类的成员变量要绅士的多'
"""
enemy.beShooted(WeaponKind = self.__weapon)

class Enemy(object):
"""这就是鬼子
"""
def __init__(self,kind):
self.__kind = kind # 通过设置property调用的私有成员变量
self.__health = 100 # 通过自己的方法调用的私有成员变量
def beShooted(self,WeaponKind):
"""失血,通过其它类调用"""
if WeaponKind == gun:
self.__health -= 10

@property # 2.6 新增
def kind(self):
"""设置成员变量为property,让它可以通过如enemy1.kind调用。不设为公用的原因
是可以控制它的access ability,如@kind.setter,@kind.deleter,而且可以附
加其它需要的操作
"""
return self.__kind

# 应用实例
me = Me()
guiZi = Enemy("boss")

print(guiZi.kind)
me.fireAt(guiZi)
vanta 2009-03-20
  • 打赏
  • 举报
回复
4楼的例子说的很明确。
guzl86 2009-03-19
  • 打赏
  • 举报
回复
还有如果有a,b,c 3各类,在b类中我想实例化a类,然后又想在c类中用b类中实例化的a类,也就是在c类中我不想再实例化a类了,我该怎么办?
guzl86 2009-03-19
  • 打赏
  • 举报
回复
比如,我有两个类,我想一个类去使用另一个类的一个函数或者是属性,我该怎么办?怎么进行引用,怎么进行调用?
Semigod 2009-03-19
  • 打赏
  • 举报
回复
问题不明确
SFinx 2009-03-19
  • 打赏
  • 举报
回复
调用b类即可。
iambic 2009-03-19
  • 打赏
  • 举报
回复
你以前在其它语言中是怎么使用类的?
king6o60 2009-03-19
  • 打赏
  • 举报
回复


class a:
def __init__(self):
self.arr1 = "i am xiaobai"

def print_out(self,x):
print x
class b:
def main(self):
mya = a()
mya.print_out(mya.arr1)
bn = b()
bn.main()





Suspended
%python bai.py
i am xiaobai
%
fox000002 2009-03-19
  • 打赏
  • 举报
回复
定义类之后,就是一种数据类型

实例化的话,用

x = MyClass()


如果是不同模块,需要用 import

import mymod

x = mymod.MyClass()


或者

from mymod import MyClass

x = MyClass()

37,719

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧