gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 09:05:39 26 4
gpt4 key购买 nike

我对 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 代码中,我将类字段声明为构造函数外部的变量。在 Python 中,我直接在构造函数内定义类字段。因此,这意味着在 Java 中我可以声明多个字段并使用构造函数方法仅初始化这些字段的子集,例如如下所示:

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做类似的事情吗?我可以在构造函数方法之外声明类字段吗?

最佳答案

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

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

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

class A:
pass

在运行时向类添加内容(这些内容将添加到该类的所有现有和 future 实例中):

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

关于python - 我可以在构造函数方法之外声明 Python 类字段吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59337021/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com