• 类的成员、嵌套


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

    一、变量

    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()
  • 相关阅读:
    详解GaussDB(for MySQL)服务:复制策略与可用性分析
    华为云的研究成果又双叒叕被MICCAI收录了!
    充分释放数据价值:安全、可信6到飞起
    未来云原生世界的“领头羊”:容器批量计算项目Volcano 1.0版本发布
    一文带你掌握OBS的两种常见的鉴权方式
    数据库实践丨MySQL多表join分析
    技术贴丨教你使用华为云鲲鹏服务器部署Discuz!论坛
    python Scrapy 从零开始学习笔记(二)
    python Scrapy 从零开始学习笔记(一)
    从零开始学Electron笔记(七)
  • 原文地址:https://www.cnblogs.com/liaopeng123/p/9550497.html
Copyright © 2020-2023  润新知