1 class dog(object):
2 "dog class"
3
4 # 公有属性,所属这个类的所有对象都可以访问
5 species = "husky"
6
7 def __init__(self,name,age):
8 # 类的成员变量
9 # 普通属性
10 self.name = name
11 self.age = age
12 # 私有属性,不可访问,不可修改,若想访问,参考get_sex()
13 self.__sex = 'man'
14
15 def sayhi(self):
16 print("the dog {0} is sayhi".format(self.name))
17
18 # 传入一个参数,参数名:food
19 def eat(self,food):
20 print("the dog name is {0},its food is {1}".format(self.name,food))
21
22 def update_age(self,update_age):
23 self.age = update_age
24
25 # 对外提供只读接口访问
26 def get_sex(self):
27 # 返回私有属性
28 return self.__sex
29
30 # 定义析构函数
31 def __del__(self):
32 print("del.....run...")
33
34 # 实例化对象
35 d = dog("alex", 18)
36 # 调sayhi方法
37 d.sayhi()
38 # 调eat方法
39 d.eat("hotdog")
40
41 print("-"*30)
42 # 在类的方法中或者类的外面都可以修改类的属性
43 # 在类里修改
44 d.update_age(22)
45 print(d.age)
46 # 在外部修改
47 d.age = 24
48 print(d.age)
49
50 print("-"*30)
51 # 在类中定义了访问私有属性的函数,所以此处可访问,但不能修改
52 print(d.get_sex())
53
54 # 强制访问私有属性:对象名._类名__属性名
55 # 强制访问
56 print(d._dog__sex)
57 # 强制修改
58 d._dog__sex = "woman"
59 print(d._dog__sex)
60
61 print("-"*30)
62 d2 = dog('lucky', 5)
63
64 # 类似于name的属性是每个对象独立的属性,并不共享
65 print(d.name, d2.name)
66
67 # 访问公有属性
68 print(d.species, d2.species)
69 # 修改d2的公有属性
70 d2.species = "teacup"
71 print(d.species, d2.species)
72
73 # 修改类的公有属性
74 dog.species = "pastoral"
75 print(d.species, d2.species)
76
77 # 由此可以看出:
78 # 访问公有属性时,会先去对象内部的成员属性里找,如果没有,则去类的公共属性找,
79 # 如果再没有,会去父类找,这里d2在对象内部定义了一个species,直接访问,
80 # 而d对象内部没有species属性,则去dog类的公有属性查找,此时dog的公有属性已经改变,
81 # 输出的自然也是改变后的值
82
83 print("-"*30)
84 # del方法会清除对象的门牌号,引用一旦清除,析构函数会自动执行
85 # 适用于关闭客户端连接等收尾工作
86 del d
87
88
89 the dog alex is sayhi
90 the dog name is alex,its food is hotdog
91 ------------------------------
92 22
93 24
94 ------------------------------
95 man
96 man
97 woman
98 ------------------------------
99 alex lucky
100 husky husky
101 husky teacup
102 pastoral teacup
103 ------------------------------
104 del.....run...