Print引用(对象)

本文通过一个Java示例程序,展示了如何使用toString方法来定制对象的字符串表示形式。特别地,文章解释了当调用println方法打印对象时,如何通过重写toString方法来自定义输出的内容。
package reusing;
class WaterSource {
  private String s;
  WaterSource() {
    System.out.println("WaterSource()");
    s = "Constructed";
  }
  public String toString() { 
//	  return getClass().getName() + "@" + Integer.toHexString(hashCode());
	  return s;
	  }
	
}
public class SprinklerSystem {
  private String valve1, valve2, valve3, valve4;
  private WaterSource source = new WaterSource();
  private int i;
  private float f;
  public String x(){
	  return "source = " + source;
  }
  public String toString() {
    return
      "valve1 = " + valve1 + " " +
      "valve2 = " + valve2 + " " +
      "valve3 = " + valve3 + " " +
      "valve4 = " + valve4 + "\n" +
      "i = " + i + " " + "f = " + f + " "
      + "source = " + source;
  }	
  public static void main(String[] args) {
	  WaterSource ss=new WaterSource();
//    SprinklerSystem sprinklers = new SprinklerSystem();
    System.out.println(ss);
    
  }
} 

   解析:

println(引用)对象:编译器调用println方法(

public void println(Object x) {
        String s = String.valueOf(x);
        synchronized (this) {
            print(s);
            newLine();
        }
    }

println方法调用valueOf方法,(空引用则返回null)返回对象的toString方法,并调用print方法打印

public static String valueOf(Object obj) {
 return (obj == null) ? "null" : obj.toString(); }

 若无类中无重写toString方法则调用默认方法

public String toString() {

        return getClass().getName() + "@" + Integer.toHexString(hashCode());

    }


 *  若重写toString方法则打印方法的返回


若print打印的是对象(引用),调用valueOf方法(空引用则返回null)返回对象的toString方法,并打印

 public void print(Object obj) {
        write(String.valueOf(obj));
    }

/**Output:
WaterSource()  
valve1 = null valve2 = null valve3 = null valve4 = null
i = 0 f = 0.0 source = Constructed  
a
WaterSource()  
Constructed 
 * 
 */


### 如何在Python中打印对象的名字或标识符 在 Python 中,直接获取并打印对象的名字并不是一件直观的事情,因为一旦定义了一个对象,它就可能被多个变量引用。然而,可以通过一些间接的方式实现这个目的。 #### 使用 `vars()` 和 `locals()` 可以利用内置函数`vars()` 或者 `locals()` 来访问当前局部符号表中的所有变量及其对应的值。通过遍历这些字典结构,找到特定的对象实例,并返回关联的键名作为其“名称”。 ```python class MyClass: pass obj = MyClass() def get_var_name(var): for k, v in locals().items(): if id(v) == id(var): # 检查两个对象的身份是否相同 return k return None print(get_var_name(obj)) # 输出 obj 的名字 'obj' ``` 这种方法仅适用于本地作用域内的变量查找,在更复杂的情况下可能会遇到局限性[^3]。 #### 利用自定义属性保存对象名称 另一种方式是在创建对象时给定一个特殊的属性来记录对象的名称: ```python class NamedObject: def __init__(self, name=None): self._name = name @property def name(self): return self._name named_obj = NamedObject(name='my_object') print(named_obj.name) # 显示设置好的对象名称'my_object' ``` 这种方式更加灵活可控,但也意味着需要提前规划好何时以及如何分配这样的名称[^1]。 #### 获取类名或其他可调用对象的名字 对于类或者其他类型的可调用对象(比如函数),可以直接使用它们自带的特殊属性`.__name__`来获得原始定义的名字: ```python class AnotherClass: pass another_instance = AnotherClass() print(type(another_instance).__name__) # 打印AnotherClass 类型名称 func = lambda x: x * 2 print(func.__name__) # 对于lambda表达式会显示'<lambda>' ``` 需要注意的是,匿名函数(lambda expressions)不会有一个有意义的人类可读的名字[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值