Python类和封装方法

Python类和封装方法,python,class,object,methods,Python,Class,Object,Methods,我是OOP新手,这是我第一次尝试创建Python类。我试图将我的3个变量设置为私有,这样只有方法更新信息(强制封装)。似乎如果我从类中删除setter和getter方法,它对我的代码没有影响(必须是初始化器方法完成这项工作?)。我能做些什么来改进这一点?谢谢 编辑-我已经更新了我的代码并删除了init。我的getter现在不工作了 #Instantiate a new Pet Instance. myPet = Pet() #Get input from user. myPet

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

编辑-我已经更新了我的代码并删除了init。我的getter现在不工作了

  #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()

不幸的是,你是对的,他们常说“执行者/执行者”是对成年人的限制。。。(如果我告诉你“不要碰它”,那么你应该不要碰它)但是没有什么限制你,你可以修改它们

同样的“特征”可以用“常数”观察到。。。在jupyther或终端中执行此操作

import math
math.pi = 1
a = math.pi
a
math.pi
您将看到,您现在将常量pi值修改为1

许多人建议使用,但这根本不是一个封装,这只是相同的“成人合同”的糖语法(IMHO:)

那么你的问题呢

我能做些什么来改进这一点


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

如果您通常不需要或不想要Python中的getter和setter,那么这个问题更合适。也不应该在类级别设置这些属性;仅在
\uuuu init\uuuu
中定义它们。不要使用双下划线前缀,除非您确切知道自己在做什么(甚至可能不知道)。最后,方法名的Python风格是带有下划线的
小写,而不是
camelCase
“如果我从类中删除setter和getter方法,它对我的代码没有影响”,因为您从未使用它们。您的代码不调用getter和getter,那么为什么您希望它们对它有任何影响?它们只是死代码。我已经更新了我的代码,但它不起作用。作业要求我使用3个set方法存储3个值,使用3个get方法返回3个值。好的,访问修饰符只是一个“成人契约”,即“我不会导入java.lang.reflect;”;)