Python 封装未正确初始化?

Python 封装未正确初始化?,python,class,encapsulation,Python,Class,Encapsulation,我只是想了解更多关于封装的知识,发现我们无法打印出已经封装的值,我们必须定义一个单独的方法来打印值,但是在我的代码中,我试图打印出我的类的一个属性,它起了作用,所以我的封装中有错误吗 代码: class Time: timethytom = 'Best' def __init__(self, hours, minutes): self.__hours = hours self.__minutes = minutes def setTim

我只是想了解更多关于封装的知识,发现我们无法打印出已经封装的值,我们必须定义一个单独的方法来打印值,但是在我的代码中,我试图打印出我的类的一个属性,它起了作用,所以我的封装中有错误吗

代码:

class Time:
    timethytom = 'Best'

    def __init__(self, hours, minutes):
        self.__hours = hours
        self.__minutes = minutes

    def setTime(self,hour,minute):
        self.__hours = hour
        self.__minutes = minute

    def getTime(self):
        print(f'Time is {self.__hours}hr {self.__minutes}min')

    def addTime(self, hour1, hour2, minute1, minute2):
        print(f'{hour1+hour2} hours and {minute1+minute2} minutes')


time1 = Time(10, 20)

time1.setTime(20,5)
time1.hours = 55
time1.getTime()

print(time1.hours)


提前感谢:)

在Python中,您可以从类外创建类中的公共变量,如下所示:

class xyz:
  pass

x = xyz()
x.y=10
print(x.y) #This will print 10

当您写这行时,实际上您已经在对象
time1
中创建了一个名为
hours
的变量,它与类中定义的变量
\uuuuuuhours
不同。

如果您谈论的是
time1.hours=55
,这与
self.\uuuuuuuuuuuhours
不同。后者是封装的值,第一个是由于赋值而创建的公共属性。因为它已经被创建了,所以可以打印出来。所以我应该怎么做才能使它私有化呢?你已经把它私有化了。在Python中,您不能像您那样阻止人们向现有实例添加属性。您的封装已经很好了。小建议:除非您确切知道为什么要这样做,否则最好选择单前导下划线而不是双前导下划线。它可能会导致不可预见的问题和更糟糕的调试体验H是否存在差异b/w_uuu和uuuu?当您使用单下划线时,不会发生任何情况,并且您可以从类外(封装)以原样的名称访问变量,但如果使用双下划线,然后是名称混乱,它将类的名称附加到属性前面(带前导下划线)。不客气。我建议您阅读更多有关Python中下划线的内容,请参阅本页()