有没有办法只调用一次类的init()方法.或者,当我从类创建对象时,如何禁用init()的调用?
我正在为Squish Automation Tool使用python语言.这个工具扩展了python与一些自定义对象和函数.这就是他们在手册中所说的:
Squish的Python特定扩展模块通过内部执行以下语句的等效内容自动加载:
Run Code Online (Sandbox Code Playgroud)Python import test import testData import object import objectMap import squishinfo from squish import *这意味着除非您正在开发自己的独立模块,否则无需自行导入它们.
通过这样做,他们object自动重新定义(对此),所以我尝试做新式类(如class NewClass(object):)会给我一个错误:
TypeError:调用元类库时出错.
module.__init__()最多需要2个参数(给出3个)
所以我想要object退缩.在阅读了关于元类的惊人文章之后,我正试图object使用以下代码:
class OrigObject:
__metaclass__ = type
class NewClass(OrigObject):
pass
Run Code Online (Sandbox Code Playgroud)
我的问题是:是否与继承原始object类相同?
更新:我只能使用Python 2.4(如果重要的话)
谢谢!
我正在阅读关于元类的这篇优秀文章什么是Python中的元类?.接受的答案显示了如何使用type以下签名创建类.
type(name of the class,
tuple of the parent class (for inheritance, can be empty),
dictionary containing attributes names and values)
Run Code Online (Sandbox Code Playgroud)
这让我想知道是谁创建了对象类.对象类也是由type类创建的吗?
我对Python和编程很新.
我正在制作一个基于终端的游戏作为练习项目.游戏将是一系列的房间和怪物.我的计划是制作这些课程的怪物和房间实例.我在整个游戏中创建了其中的一些,其中许多是基于玩家行为而动态创建的.
在创建新的怪物和房间时,我现在很难事先知道他们的名字.像这样:
class Monster(object):
pass
Monster1 = Monster(something)
Run Code Online (Sandbox Code Playgroud)
必须知道运行前的实例名称似乎是一个笨拙的解决方案.我认为让变量跟踪怪物数量会更容易,然后动态创建实例名称.因此创建的第一个怪物实例将自动成为Monster1,下一个将是Monster2等.
像这样的东西:
class Monster(object):
pass
monster_id = 0
def createMonster(monster_id)
monster_instance = "Monster" + str(monster_id)
monster_id += 1
# The following is where i'm stuck. Basically I want to have the instance name be equal to the content of monster_instance
(monster_instance) = Monster()
Run Code Online (Sandbox Code Playgroud)
所以问题是:如何在不知道实例运行时的名称的情况下创建类的实例?
我也想知道我是否很难让这个工作,因为我做了一些愚蠢的事情,这是一个更聪明/更优雅的方式.在任何情况下都非常感谢所有帮助和意见.
>>> type(type)
<type 'type'>
Run Code Online (Sandbox Code Playgroud)
我希望类型type是一个函数,因为它用于返回参数的类型.这是否意味着类型可以接受参数?是type不寻常的/特别的?
我需要有静态或外部列表,该列表将被A类的每个对象使用。列表的值只需要初始化一次,并且应该从构造函数参数中获取,例如:
def initialize(x, y):
for i in range(0, x):
static_to_return.append([])
for j in range(0, y):
static_to_return[i].append((i * x) + 1 + y)
return static_to_return
class A:
static_member = initialize(x, y)
def __init__(self, x, y):
self.x = x
self.y = y
Run Code Online (Sandbox Code Playgroud)
如何使这项工作有效?也许最好将其移至static_member另一个模块?static_member或者可以在函数中写入吗__init__?
我试图理解Python中的“可调用对象”是什么,以及类可调用的含义。我在玩以下代码:
class A(object):
def __init__(self):
pass
print("Is A callable? " + str(callable(A)))
a=A()
print("created a")
a()
Run Code Online (Sandbox Code Playgroud)
得到以下结果:
Is A callable? True
created a
Traceback (most recent call last):
File "test2.py", line 11, in <module>
a()
TypeError: 'A' object is not callable
Run Code Online (Sandbox Code Playgroud)
此外,
print(type(A.__call__()))
Run Code Online (Sandbox Code Playgroud)
给出:
<class '__main__.A'>
Run Code Online (Sandbox Code Playgroud)
这是否意味着A类具有__call__方法?为什么是class类?
A.__call__()每次使用A()实例化时都会被调用吗?
我目前正在学习 python OOP 模型并被告知
type本身源自object,并且object源自type
我知道这object是python 3.x中每个类的默认超类,并且typeclass用于创建类(即类对象)。object并type一起(以某种方式)构成了 python OOP 的基础,但我仍然对上面的陈述感到困惑。
object有人可以详细解释 和之间的关系type以及它们在 python OOP 中扮演的角色吗?谢谢
假设我定义一个A带有元类的类,如下所示:
class Meta(type):
pass
class A(metaclass=Meta):
pass
Run Code Online (Sandbox Code Playgroud)
然后,当我尝试访问类的名称时,A我得到元类的名称:
A.__class__.__name__
# 'Meta'
Run Code Online (Sandbox Code Playgroud)
但是,它不应该给我A,我定义的类吗?
注意:我尝试使用A.__mro__[0].__name__,它确实给了我A,但我仍然很困惑为什么A.__class__给我元类名称。有人对此有解释吗?
在Ruby中,可以为在对象上定义方法时创建回调:
module Chatty
def self.method_added(method_name)
puts "Adding #{method_name.inspect}"
end
def self.some_class_method() end
def some_instance_method() end
end
# => Adding :some_instance_method
Run Code Online (Sandbox Code Playgroud)
Python有没有类似的回调?