如何使用Python创建一个Java getter-setter生成器

254 阅读5分钟

使用Python创建一个Java getter-setter生成器

Python的getters和setters是独一无二的。它们允许数据封装,而其他语言则有用于私有变量的隐藏字段。

一些面向对象编程(OOP)语言使用getters和setters来存储数据。我们把一个对象类的属性隐藏起来,这样其他类的方法就不会意外地改变数据。

在面向对象编程语言中,这些方法获取和改变数据。设置一个对象的属性值被称为setting 。在这篇文章中,我们将学习如何使用 Python 的 getter 和 setter 方法。

前提条件

要跟上本教程,你需要:

  • [下载]Python IDE 或使用[在线编译器]来运行代码。
  • 具备Python和Java编程语言的基本知识。

理解getters和setters

getter方法返回的值就是它的参数。这对面向对象编程的私有属性访问很有用。一个setter修改了一个属性的值。

它有助于在面向对象编程中建立私有类特性。使用getter和setter可以确保有数据封装。

为什么我们使用设置器和获取器。

  • 为了促进封装。
  • 即使内部发生变化,也要保持接口。
  • 为获取和设置值添加验证逻辑。
  • 将属性的内部表述外部化。
  • 确保没有对类字段的直接访问或改变。
  • 使用getters和setters来配置访问级别。

使用普通函数获取获取器和设置器的行为

如果我们使用标准的get()set() 方法来获取获取器和设置器属性,将不需要任何额外的特定实现代码。

class section:
    def __init__(ascetic, span = 0):   
         ascetic._span = span     
    def get_span(ascetic):   
        return ascetic._span    
    def set_span(ascetic, k):   
        ascetic._span = k  
    
kelvin = section()   
kelvin.set_span(34)   
print(kelvin.get_span())   
print(kelvin._span)

输出。

34
34

在上面的代码中,函数get_span()set_span() 作为正常的函数,并没有作为获取器和设置器的影响。为了实现这样的功能,Python有一个特殊的函数叫做property()

使用@Property decorators获得getters和setters行为

为了在前面的方法中完成getters和setters的行为,我们利用了property() 函数。Getters和setters也被用来验证属性值的获取和设置,正如本文前面所说的那样。

实现属性函数的另一个选择是使用一个装饰器。Python 中的一个内置装饰器是@property

任何装饰器的主要目标都是以这样一种方式来更新你的类的方法或属性,使你的类的用户不需要改变他们的代码。

下面是一个示例代码。

class Section:   
     def __init__(ascetic):   
          ascetic._span = 0  
     def get_span(ascetic):   
         print("The getters method")   
         return ascetic._span  
     def set_span(ascetic, k):   
         print("The setters method")   
         ascetic._span = k   
     def del_span(ascetic):   
         del ascetic._span   
     span = property(get_span, set_span, del_span)    
    
kelvin = Section()   
    
kelvin.span = 23  
    
print(kelvin.span)  

输出。

The setters method
The getters method
23

上面的程序有一条打印语句。输出有三行,因为setter方法set_span() 和getter函数get_span() 都被调用了。因此,span 是一个属性对象,有助于确保私有变量的访问。

使用property() 函数的获取器和设置器行为

之前的技术使用property() 方法来实现getters和setters。获取器和设置器是用来检查属性值的。

一个装饰器可以施加属性函数,@property 装饰Python。装饰器的主要目标是在不修改用户代码的情况下改变类方法或属性。

class Section:   
     def __init__(ascetic):   
          ascetic._span = 0  
        
     @property  
     def span(ascetic):   
         print("The getters method")   
         return ascetic._span   
         
       
     @span.setter   
     def span(ascetic, k):   
         if(k < 20):   
            raise ValueError("the span is ineligible")   
         print("The setters method")   
         ascetic._span = k   
    
kelvin = Section()   
    
kelvin.span = 32 
    
print(kelvin.span)

输出。

The setters method
The getters method
32

@property 装饰器被用来构造Python的getters和setters,如上面的代码所示。如果在前面的例子中,跨度被设置为小于32,就会产生一个ValueError ,作为验证代码。

项目算法

在这个项目中,我们有一个变量名称和数据类型的列表,必须显示它们所有的getter-setter函数,同时遵守基本的Java编程规则。

为了能够做到这一点,我们遵循下面的算法。

  • 将每个变量的第一个字符转化为大写字母。
  • 在每个被更新的变量的开头加上 "get "这个词,并把它们放在一个列表中。
  • 在每个被更新的变量的开头加上 "set "这个词,并把它们保存在一个列表中。
  • 通过字符串连接打印每个变量及其相应的数据类型的getter和setter方法。

算法的实现

# Print getter and setter methods
def print_getter_setter(variables, datatypes):
    
    # store the get and set variables
    getters = []
    setters = []
    for var in variables:
    
        # Prefix each variable with "get" and turn the initial character to uppercase.
        getter = "get" + var[0].capitalize() + var[1:]
        getters.append(getter)
        
        # Prefix each variable with "set" and turn the initial character to uppercase.
        setter = "set" + var[0].capitalize() + var[1:]
        setters.append(setter)
   
    for k in range(len(variables)):
    
        #  Print out the getter method
        print("public " + datatypes[k] + " " + getters[k] +
            "() {\n\treturn " + variables[k] + ";\n}\n")
            
         #  Print out the setter method
        print("public void " + setters[k] + "(" + datatypes[k] +
            " " + variables[k] + ") {\n\tthis." + variables[k] +
            " = " + variables[k] + ";\n}\n")

if __name__=="__main__":

    # A list of variables
    variables = ["cdf", "stdID", "section", "y"]

    # A list of datatypes 
    datatypes = ["int", "float", "double" , "String"]

    print_getter_setter(variables, datatypes)

输出。

public int getCdf() {
    return cdf;
}

public void setCdf(int cdf) {
    this.cdf = cdf;
}

public float getStdID() {
    return stdID;
}

public void setStdID(float stdID) {
    this.stdID = stdID;
}

public double getSection() {
    return section;
}

public void setSection(double section) {
    this.section = section;
}

public String getY() {
    return y;
}

public void setY(String y) {
    this.y = y;
}

我们可以将程序分解如下所示。

  • def print_getter_setter(variables, datatypes): - 是一个函数,根据Java打印变量的getter和setter方法。
  • getter = [] 和 - 分别用于存储设置和获取变量。setter = []
  • 在存储变量后,我们在每个变量中预置getset ,并将初始字符变成大写。
  • print("public " + datatypes[i] + " " + getters[i] + "() {\n\treturn " + variables[i] + ";\n}\n") - 打印出getter方法。
  • print("public void " + setters[i] + "(" + datatypes[i] + " " + variables[i] + ") {\n\tthis." + variables[i] + " = " + variables[i] + ";\n}\n") - 打印出setter方法。
  • if __name__=="__main__": - 是驱动函数。
  • variables = ["abc", "empId", "GFG", "x"] - 列出所有作为输出变量被重新使用的变量,而 ,列出与变量列表相对应的数据类型。datatypes = ["int", "float", "double" , "String"]

总结

在这篇文章中,我们已经了解了什么是python编程语言中的getters和setters。我们还学习了如何使用property() 函数、@Property 装饰器获得getterssetters 行为,最后使用普通函数。

我敦促读者使用所获得的知识来推进其他编程语言中的getters和setters。