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

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

考虑这样的代码:

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

action_figure = Toy('red', 10)

好的,这样做很清楚而且非常简单:

它定义了一个Toy类。在构造函数中,方法是定义两个字段以及如何设置字段值。最后(在“主”中)将创建一个新的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中,我可以声明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;
    }
}

其中还有field3,field4和field5字段,这些字段不会由我的构造函数初始化(以防我可以使用setter方法第二次设置theyr值)。

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

参考方案

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

实例变量(任何带有self.的变量)只能在方法中定义。选择在构造函数与其他方法中定义属性是关于其他人能够快速理解您的代码/数据结构(尽管由于动态性调用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

Python sqlite3数据库已锁定 - python

我在Windows上使用Python 3和sqlite3。我正在开发一个使用数据库存储联系人的小型应用程序。我注意到,如果应用程序被强制关闭(通过错误或通过任务管理器结束),则会收到sqlite3错误(sqlite3.OperationalError:数据库已锁定)。我想这是因为在应用程序关闭之前,我没有正确关闭数据库连接。我已经试过了: connectio…

Python-Excel导出 - python

我有以下代码:import pandas as pd import requests from bs4 import BeautifulSoup res = requests.get("https://www.bankier.pl/gielda/notowania/akcje") soup = BeautifulSoup(res.cont…

Python:传递记录器是个好主意吗? - python

我的Web服务器的API日志如下:started started succeeded failed 那是同时收到的两个请求。很难说哪一个成功或失败。为了彼此分离请求,我为每个请求创建了一个随机数,并将其用作记录器的名称logger = logging.getLogger(random_number) 日志变成[111] started [222] start…

Python pytz时区函数返回的时区为9分钟 - python

由于某些原因,我无法从以下代码中找出原因:>>> from pytz import timezone >>> timezone('America/Chicago') 我得到:<DstTzInfo 'America/Chicago' LMT-1 day, 18:09:00 STD…

用大写字母拆分字符串,但忽略AAA Python Regex - python

我的正则表达式:vendor = "MyNameIsJoe. I'mWorkerInAAAinc." ven = re.split(r'(?<=[a-z])[A-Z]|[A-Z](?=[a-z])', vendor) 以大写字母分割字符串,例如:'我的名字是乔。 I'mWorkerInAAAinc”变成…