我可以在构造方法之外声明 Python 类字段吗?

新手上路,请多包涵

我绝对是 Python 的新手(我来自 Java),我对类字段有以下疑问。

考虑这样的代码:

 class Toy():
    def __init__(self, color, age):
        self.color = color
        self.age = age

action_figure = Toy('red', 10)

好的,所做的事情很清楚也很简单:

它正在定义一个 Toy 类。在构造方法中定义了两个字段以及如何设置字段值。最后(在“main”中)创建了一个新的 Toy 实例,在构造函数调用中传递字段的值。

好吧,清楚了……但我有疑问。在 Java 中定义同一个类我做了这样的事情:

 public class Toy {
    private String color;
    private int age;

    // CONSTRUCTOR:
    public Dog(String color, int age) {
        this.color = color;
        this.age = age;
    }
}

好的,它很相似,但我发现了很大的不同。在我的 Java conde 中,我在构造方法之外将类字段声明为变量。在 Python 中,我直接在构造方法中定义类字段。所以这意味着在 Java 中我可以声明 n 个类字段并使用构造方法只初始化这些字段的一个子集,例如这样的东西:

 public class Toy {
    private String color;
    private int age;
    private String field3;
    private String field4;
    private String field5;

    // CONSTRUCTOR:
    public Dog(String color, int age) {
        this.color = color;
        this.age = age;
    }
}

我还有 field3field4field5 字段,它们不会被我的构造函数初始化(以防我可以使用 setter 方法第二次设置它们的值)。

我可以在 Python 中做类似的事情吗?我可以在构造函数方法之外声明类字段吗?

原文由 AndreaNobili 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 466
2 个回答

python 中的类与 c++/java 中的类根本不同,因为 c++/java 类具有固定的数据结构和大小(字节),因为每个属性都是在所有方法之外声明或定义的(通常作为私有变量),但在 python 中一切都是即时(动态类型)。

选择在构造函数中定义属性与其他方法是关于其他人能够快速理解您的代码/数据结构(尽管由于动态调用 python 类数据结构是不合适的)

作为动态性的一个例子,您甚至可以在运行时向类甚至实例添加新的方法和属性:

 class A:
    pass

在运行时向类添加东西(这些将被添加到该类的所有现有和未来实例):

 A.key = val

def f(self):
    return 0

A.myfunction = f
a = A()
a.myfunction()
# 0

在运行时向单个实例添加内容:

 a=A()
a.attr='something'

def f(self):
    return 0

a.fun=f.__get__(a)
a.fun()
# 0

原文由 Piyush Singh 发布,翻译遵循 CC BY-SA 4.0 许可协议

在 python 中,你可以这样做:

 class Toy():
    def__init__(self, color, age):
        self.color = color
        self.age = age

    def another_method(self, f):
         self.field3 = f + 4
         return self.field3

但通常建议为了清楚起见(此处有更多参数: https ://stackoverflow.com/a/38378757/4709400)在构造函数中初始化所有实例变量,所以你会这样做:

 class Toy():
    def__init__(self, color, age):
        self.color = color
        self.age = age
        self.field3 = None
        self.field4 = 0 # for instance
        self.field5 = "" # for instance

    def another_method(self, f):
         self.field3 = f + 4
         return self.field3

原文由 stellasia 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题