【问题标题】:Python Class and encapsulation methodsPython 类和封装方法
【发布时间】:2017-08-16 08:40:41
【问题描述】:

我是 OOP 新手,这是我第一次尝试创建 Python 类。我试图将我的 3 个变量设为私有,以便只有方法更新信息(强制封装)。似乎如果我从我的类中删除 setter 和 getters 方法,它对我的​​代码没有影响(必须是初始化方法完成工作?)。我能做些什么来改善这一点?谢谢。

编辑- 我更新了我的代码并删除了 init。我的吸气剂现在不工作了。

  #Instantiate a new Pet Instance.
  myPet = Pet()

  #Get input from user.
  myPet.setName = input("Enter the pet's name: ")
  myPet.setTypes = input("Enter the pet's type (Dog, Cat, Bird, etc.): ")
  myPet.setAge = input("Enter the pet's age (in years): ")
  while myPet.setAge.isalpha():
    print()
    print("Age cannot contain numbers. Try again.")
    myPet.setAge = input("Enter the pet's age (in years): ")


  #Call the showPetInfo module using new instanced object.
  myPet.showPetInfo()




class Pet:

  #Fields of the Pet Class.
  __PetName = ""
  __PetType = ""
  __PetAge = ""


  #Setter methods.

  def setName(self,name):
    self.__PetName = name


  def setTypes(self,types):
    self.__PetType = types


  def setAge(self,age):
    self.__PetAge = age

  #Getter methods.
  @property
  def getName(self):
    return self.__PetName

  @property 
  def getType(self):
    return self.__PetType

  @property 
  def getAge(self):
    return self.__PetAge

  def showPetInfo(self):
    print("\n \n \n \n")
    print("Here is your pet's information. Your pet's name is {}, it is a {} and it is {} years old.".format(self.getName,self.getType,self.getAge))

main()

【问题讨论】:

  • 这个问题在codereview.stackexchange.com上问更合适
  • 您通常不需要或不想要 Python 中的 getter 和 setter。您也不应该在类级别设置这些属性;仅在 __init__ 中定义它们。不要使用双下划线前缀,除非您确切地知道自己在做什么(甚至可能不知道)。最后,方法名称的 Python 样式是 lower_case_with_underscores,而不是 camelCase
  • “如果我从我的类中删除 setter 和 getters 方法,它对我的​​代码没有影响” 因为你从不使用它们。
  • 您的代码不会调用 getter 和 getter 那么您为什么希望它们对其产生任何影响?它们只是死代码。
  • 我已经更新了我的代码,但它不起作用。作业要求我使用 3 个 set 方法来存储 3 个值,并使用 3 个 get 方法来返回 3 个值。

标签: python class object methods


【解决方案1】:

不幸的是,你是对的,他们过去常说 setter/getter 是对成年人进行限制的合同......(如果我告诉你“不要碰它”那么你 不应该碰它)但是有没有什么限制你,你可以修改它们!

使用“常量”可以观察到相同的“特征”...在 jupyther 或终端中执行此操作

import math
math.pi = 1
a = math.pi
a
math.pi

您会看到您现在将常量 pi 值修改为 1

许多人建议使用 properties 但这根本不是一个封装,这只是同一个“成人合同”恕我直言的糖语法:)

所以你的问题

我能做些什么来改善这一点?

记录您正在编写的代码,以便使用它的另一部分了解必须如何处理代码、对象中的实例状态

【讨论】:

  • 嗯,访问修饰符只是“我不会导入 java.lang.reflect;”的“成人合同”。 ;)
猜你喜欢
  • 2010-11-20
  • 2014-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多