// Copyright (c) Corporation for National Research Initiatives package org.python.core; import java.util.Vector; import java.io.Serializable; /** * A python class. */ public class PyClass extends PyObject { /** * Holds the namespace for this class **/ public PyObject __dict__; /** * The base classes of this class **/ public PyTuple __bases__; /** * The name of this class **/ public String __name__; // Store these methods for performance optimization // These are only used by PyInstance PyObject __getattr__, __setattr__, __delattr__, __tojava__, __del__, __contains__; // Holds the classes for which this is a proxy // Only used when subclassing from a Java class protected Class proxyClass; public static PyClass __class__; PyClass(boolean fakeArg) { super(fakeArg); proxyClass = null; } protected PyClass(PyClass c) { super(c); proxyClass = null; } /** * Create a python class. * * @param name name of the class. * @param bases A list of base classes. * @param dict The class dict. Normally this dict is returned by * the class code object. * * @see org.python.core.Py#makeClass(String, PyObject[], PyCode, PyObject) */ public PyClass(String name, PyTuple bases, PyObject dict) { this(name, bases, dict, null); } /** * Create a python class which inherit from a java class and where * we already have generated a proxyclass. If we do not have a * pre-generated proxyclass, the class initialization method will * create such a proxyclass if bases contain a java class. * * @param name name of the class. * @param bases A list of base classes. * @param dict The class dict. Normally this dict is returned by * the class code object. * * @see org.python.core.Py#makeClass(String, PyObject[], PyCode, * PyObject, Class) */ public PyClass(String name, PyTuple bases, PyObject dict, Class proxyClass) { super(__class__); this.proxyClass = proxyClass; init(name, bases, dict); } protected Class getProxyClass() { return proxyClass; } void init(String name, PyTuple bases, PyObject dict) { //System.out.println("bases: "+bases+", "+name.string); //System.out.println("init class: "+name); __name__ = name; __bases__ = bases; __dict__ = dict; findModule(dict); if (proxyClass == null) { Vector interfaces = new Vector(); Class baseClass = null; for (int i=0; i 0 ? 1 : 0; } public PyString __str__() { // Current CPython standard is that str(class) prints as // module.class. If the class has no module, then just the class // name is printed. if (__dict__ == null) return new PyString(__name__); PyObject mod = __dict__.__finditem__("__module__"); if (mod == null || !(mod instanceof PyString)) return new PyString(__name__); String smod = ((PyString)mod).toString(); return new PyString(smod + "." + __name__); } public String toString() { PyObject mod = __dict__.__finditem__("__module__"); String smod; if (mod == null || !(mod instanceof PyString)) smod = ""; else smod = ((PyString)mod).toString(); return ""; } }