Python类和封装方法
我是OOP新手,这是我第一次尝试创建Python类。我试图将我的3个变量设置为私有,这样只有方法更新信息(强制封装)。似乎如果我从类中删除setter和getter方法,它对我的代码没有影响(必须是初始化器方法完成这项工作?)。我能做些什么来改进这一点?谢谢 编辑-我已经更新了我的代码并删除了init。我的getter现在不工作了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
#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;”;)