Python学习(一):对象和类

可变对象和不可变对象

当将一个可变对象传给函数时,函数可能会改变这个对象的内容。

Python中的数字和字符串都是不可变对象,它们的内容不可以被改变。

 1 from Circle import Circle 
 2 
 3 def main():
 4     # Create a Circle object with radius 1
 5     myCircle = Circle()
 6 
 7     # Print areas for radius 1, 2, 3, 4, and 5.
 8     n = 5
 9     printAreas(myCircle, n)
10 
11     # Display myCircle.radius and times
12     print("\nRadius is", myCircle.radius)
13     print("n is", n)
14   
15 # Print a table of areas for radius 
16 def printAreas(c, times):
17     print("Radius \t\tArea")
18     while times >= 1:
19         print(c.radius, "\t\t", c.getArea())
20         c.radius = c.radius + 1
21         times -= 1
22 
23 main() # Call the main function
运行结果:
Radius Area
1 3.141592653589793 2 12.566370614359172 3 28.274333882308138 4 50.26548245743669 5 78.53981633974483 Radius is 6 n is 5

当你将一个对象传递给函数,就是将这个对象的引用传递给函数。但是传递不可变对象和可变对象之间还有更重要的区别:

(1)像数字或字符串这样的不可变对象参数,函数外的对象的原始值并没有改变

(2)像圆这样的可变对象参数,如果对象的内容在函数内被改变,则对象的原始值改变

在第20行,Circle对象c的redius属性增加1。c.redius+1创建了一个新的int对象,并将它赋值给c.redius。myCircle和c都指向同一个对象。当printAreas函数完成后,c.redius是6。所以,由第12行可以看出,myCircle.redius的输出结果为6。在第21行,times-1创建了一个新的int对象,并赋值给times。在函数printAreas之外,n还是5。所以,在第13行n的输出还是5。

隐藏数据域

在Python中,私有数据域是以两个下划线开始来定义的,你也可以用两个下划线开始来定义私有方法。
私有数据域和方法可以在类内部被访问,但他们不能在类外被访问,为了让客户端可以访问数据域,就要提供一个get方法返回它的值
为了使数据域可以被更改,就要提供一个set方法去设置一个新值
通俗的讲,
get方法是指获取器(或访问器),set方法是指设置器(或修改器)

1.一个get方法有如下方法头

1 def getPropertyName(self):

 

2.如果返回类型是布尔型,那么习惯上get方法被定义为

1 def isPropertyName(self):

 

3.一个set方法有如下方法头

1 def setPropertyName(self, propertyValue):

 

4.例如:

 1 #ex1.py
 2 import math
 3 class Circle:
 4     def __init__(self, radius = 1):
 5         self.__radius = radius
 6 
 7     def getRadius(self):
 8         return self.__radius
 9 
10     def getPerimeter(self):
11         return 2 * self.__radius * math.pi
12 
13     def getArea(self):
14         return self.__radius * self.__radius * math.pi
 1 from ex1 import Circle
 2 
 3 
 4 def main():
 5     c = Circle(5)
 6 #   c.__radius    # 出现错误:AttributeError: 'Circle' object has no attribute '__radius'    
 7     print(c.getRadius())   # 输出结果为:5 
 8 
 9 
10 main()

注意:使用两个下划线开头来命名私有数据域和方法,但不要以一个以上的下划线结尾。在Python中,以两个下划线开头同时以两个下划线结尾的名字具有特殊含义

posted @ 2019-03-19 12:45  浅--搁  阅读(352)  评论(0编辑  收藏  举报