类的成员、嵌套

成员分类:变量、方法、属性

一、变量

1、变量分类变量和实例变量

 1 class Foo:
 2     # 类变量(静态字段)
 3     country = "中国"
 4 
 5     def __init__(self, name):
 6         # 实例变量(字段)
 7         self.name = name
 8 
 9     def func(self):
10         pass

准则:实例变量访问时,使用对象访问,类变量访问时,使用类方法访问

 当所有对象中有共同的字段时且要改都改要删都删时,可以将 实例变量(字段) 提取到 类变量(静态字段)

常见的访问类型

 1 obj1 = Foo('张华')
 2 obj2 = Foo('王东')
 3 
 4 #易错点1
 5 obj1.name = 'Tom'
 6 print(obj1.name) # Tom
 7 print(obj2.name) # 王东
 8 
 9 #易错点2
10 obj1.country = '美国'
11 print(obj1.country) # 美国
12 print(obj2.country) # 中国
13 
14 #易错点3
15 Foo.country = '美国'
16 print(obj1.country) # 美国
17 print(obj2.country) # 美国

2、公有变量和私有变量


  1、公有实例变量

 1 class Foo:
 2 
 3     def __init__(self,name):
 4         self.name = name
 5         self.age = 123
 6 
 7     def func(self):
 8         print(self.name)
 9 
10 
11 obj = Foo('Bart')
12 print(obj.name)
13 print(obj.age)
14 obj.func()

  2、私有实例变量 私有实例变量可以通过内部访问

 1 class Foo:
 2 
 3     def __init__(self,name):
 4         # 私有实例变量(私有字段)
 5         self.__name = name
 6         self.age = 123
 7 
 8     def func(self):
 9         print(self.__name)
10 
11 obj = Foo('张**')
12 print(obj.age)
13 #obj.__name # 无法访问
14 obj.func()  # 找一个内部人:func, 让func帮助你执行内部私有 __name

  3、公有类变量

 1 class Foo:
 2     country = "中国"
 3 
 4     def __init__(self):
 5         pass
 6 
 7     def func(self):
 8         # 内部调用
 9         print(self.country)
10         print(Foo.country) # 推荐
11 
12 
13 # 外部调用
14 print(Foo.country)
15 
16 obj = Foo()
17 obj.func()

  4、私有类变量

 1 class Foo:
 2     __country = "中国"
 3 
 4     def __init__(self):
 5         pass
 6 
 7     def func(self):
 8         # 内部调用
 9         print(self.__country)
10         print(Foo.__country)  # 推荐
11 
12 # 外部无法调用私有类变量
13 # print(Foo.country)
14 
15 obj = Foo()
16 obj.func()


二、方法

1、实例方法

 1 class Foo(object):
 2     def __init__(self, name):
 3         self.name = name
 4 
 5     def func(self):
 6         print(self.name)
 7 
 8 
 9 obj = Foo('史**')
10 obj.func()

2、静态方法

 1  class Foo(object):
 2      def __init__(self, name):
 3          self.name = name
 4 
 5      # 实例方法
 6      def func(self):
 7         print(self.name)
 8 
 9      # 静态方法,如果方法无需使用对象中封装的值,那么就可以使用静态方法
10      @staticmethod
11      def display(a1,a2):
12          return a1 + a2
13 
14  obj = Foo('Tom')
15  obj.func()
16 
17  ret = Foo.display(1,3)
18  print(ret)

总结:

  1,静态方法参数可有可无 。

  2,方法的调用 类.方法名()/对象.方法名
  3,在无需调用对象中封装的值时,可以选择静态方法

3、类方法

 1 class Foo(object):
 2     def __init__(self, name):
 3         self.name = name
 4 
 5     # 实例方法,self是对象
 6     def func(self):
 7         print(self.name)
 8 
 9     # 静态方法,如果方法无需使用对象中封装的值,那么就可以使用静态方法
10     @staticmethod
11     def display(a1,a2):
12         return a1 + a2
13 
14     # 类方法,cls是类
15     @classmethod
16     def show(cls,x1,x2):
17         print(cls,x1,x2)
18 
19 # 执行类方法
20 Foo.show(1,8)

总结:

  1类方法的参数至少有一个cls参数

  2执行时类名.方法名()      # 默认会将当前类传到参数中.

  3如果在方法中会使用到当前类,那么就可以使用类方法.

4、私有的实例方法

 1 class Foo(object):
 2 
 3 
 4     def __init__(self):
 5         pass
 6 
 7 
 8     def __display(self,arg):
 9         print('私有方法',arg)
10 
11     def func(self):
12         self.__display(123)
13 
14 obj = Foo()
15 # obj.__display(123) # 无法访问
16 obj.func()


5、私有的静态方法

 1 class Foo(object):
 2 
 3 
 4     def __init__(self):
 5         pass
 6 
 7     @staticmethod
 8     def __display(arg):
 9         print('私有静态 方法',arg)
10 
11     def func(self):
12         Foo.__display(123)
13 
14     @staticmethod
15     def get_display():
16         Foo.__display(888)
17 
18 # Foo.__display(123) 报错
19 
20 obj = Foo()
21 obj.func()
22 
23 Foo.get_display()


三、属性,属性可以看做是由实例方法变种而来

 1 class Foo(object):
 2     def __init__(self):
 3         pass
 4 
 5     @property
 6     def start(self):
 7         return 1
 8 
 9     @property
10     def end(self):
11         return 10
12 
13 obj = Foo()
14 print(obj.start)
15 print(obj.end)


总结:

  1方法参数:只有一个self

  2调用时:无需加括号  对象.方法

  3应用场景: 对于简单的方法,当无需传参且有返回值时,可以使用 @property

 

四、嵌套

 1 class School(object):
 2     def __init__(self, name, address):
 3         self.name = name
 4         self.address = address
 5 
 6     def speech(self):
 7         print('讲课')
 8 
 9 obj1 = School('北京校区', '海淀区')
10 obj2 = School('上海校区', '浦东新区')
11 obj3 = School('深圳校区', '南山区')
12 class Teacher(object):
13     def __init__(self, name, age, salary):
14         self.name = name
15         self.age = age
16         self.__salary = salary
17         self.school = None
18 
19 t1 = Teacher("Alent", 19, 188888)
20 t2 = Teacher('Bart', 18, 60)
21 t3 = Teacher('Tom',16, 900000)
22 # ############## 老师分配校区
23 t1.school = obj1
24 t2.school = obj1
25 t3.school = obj2
26 # ####################################
27 # 查看t1老师,所在的校区名称/地址
28 print(t1.school.name)
29 print(t1.school.address)
30 print(t1.name)
31 print(t1.age)
32 t1.school.speech()

 

posted @ 2018-08-28 20:07  神神气气  阅读(726)  评论(0编辑  收藏  举报