如何将示例Python类编写为Java简单bean?

如何将示例Python类编写为Java简单bean?,java,python,oop,multilingual,Java,Python,Oop,Multilingual,我学习了Python,用这种语言编写类似乎更复杂。我不是什么都懂。Java代码比Pythonmagic方法更长,但更清晰。如何在Python中编写代码类,与下面在Java中编写的代码类最为相似: public class Person { private String name; private String surname; private int age; public Person(String name, String surname, int age)

我学习了Python,用这种语言编写类似乎更复杂。我不是什么都懂。Java代码比Pythonmagic方法更长,但更清晰。如何在Python中编写代码类,与下面在Java中编写的代码类最为相似:

public class Person {
    private String name;
    private String surname;
    private int age;

    public Person(String name, String surname, int age) {
        this.name = name;
        this.surname = surname;
        this.age = age;
    }

    public String getName() { return name; }

    public void setName(String name) { this.name = name; }

    public String getSurname() { return surname; }

    public void setSurname(String surname) { this.surname = surname; }

    public int getAge() { return age; }
    
    public void setAge(int age) {
        this.age = age;
    }

    @java.lang.Override
    public java.lang.String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", surname='" + surname + '\'' +
                ", age=" + age +
                '}';
    }
}

我知道Python没有完全封装,因此不可能创建私有字段,例如,但我正在寻找这种语言的最佳类模式:)如何用这种语言编写最有效的类?

私有方法在Python中是按约定的。您可以使用
\u variabe
指示某些内容应被视为私有。使用双下划线(如
\uu variable
)会损坏名称。变量仍然是可访问的,但它更难,并且由Python解释器强制执行

通常,Python中不需要getter和setter。您可以将类编写为:

class Person:

    def __init__(self, name, surname, age):
        self.name = name
        self.surname = surname
        self.age = age

    def __str__(self):
        return f'Person{{name={self.name},surname={self.surname},age={self.age}}}'


john = Person('John', 'Smith', 44)
print(john)
Person{name=John,surname=Smith,age=44}
print(john.age)
44
如果以后需要为设置属性添加功能,可以通过添加
@property
注释,然后添加getter/setter,将旧的公共变量更改为由属性修改的私有变量:

class Person:

    def __init__(self, name, surname, age):
        self.name = name
        self.surname = surname
        self.age = age
        
    @property
    def name(self):
        return self._name
        
    @name.setter
    def name(self, value):
        self._name = value[0].upper() + value[1:]
        
    def __str__(self):
        return f'Person{{name={self.name},surname={self.surname},age={self.age}}}'

j = Person('john', 'smith', 14)
print(j)
Person{name=John,surname=smith,age=14}
print(j.name)
John

这允许属性从一个字段更改为一个函数处理的内容,而无需任何访问它的代码进行更改。

太棒了!感谢您提供的解决方案:)您是否使用“dict表示法”编辑对象?这看起来很奇怪:)我知道你们并没有创建新的字典,你们只把参数传递给构造函数。您必须知道键名吗?字符串中的大括号
{}
是f字符串表示法。它简化了以字符串形式打印变量的过程。这不是一本字典。打印语句下的行也是它们打印出来的。我之所以在整件事上用大括号括起来,唯一的原因是你在问题中的
toString()
示例中就是这样做的。