今日内容

  • 类成员
  • 成员修饰符

内容回顾 & 补充

  1. 三大特性

    • 封装

      • 函数封装到类

      • 数据封装到对象 *

        1. class Foo:
        2. def __init__(self,name,age):
        3. self.name = name
        4. self.age = age
        5. obj = Foo('alex',19)
    • 继承

    • 多态

内容详细

1.成员

    • 类变量
    • 绑定方法
    • 类方法
    • 静态方法
    • 属性
  • 实例(对象)
    • 实例变量

1.1 实例变量

  1. class Foo:
  2. def __init__(self,name):
  3. self.name=name
  4. def func(self):
  5. print(self.name)
  6. obj1=Foo('ALEX')
  7. obj1.func()
  8. obj2=Foo('ERIC')
  9. obj2.func()

1.2 类变量

  1. class Foo:
  2. city='武汉'
  3. def __init__(self,name):
  4. self.name=name
  5. def func(self):
  6. pass
  7. obj1=Foo('ALEX')
  8. print(obj1.name)
  9. print(obj1.city)
  10. print(Foo.city)
  11. obj2=Foo('ERIC')
  12. print(obj2.name)
  13. print(obj2.city)
  14. print(Foo.city)
  15. ALEX
  16. 武汉
  17. 武汉
  18. ERIC
  19. 武汉
  20. 武汉
  • 定义:写在类的下一级和方法同一级。

  • 访问:

    1. 类.类变量名称
    2. 对象.类变量名称
  • 面试题

    1. class Base:
    2. x = 1
    3. obj = Base()
    4. print(obj.x) # 先去对象中找,没有再去类中找。
    5. obj.y = 123 # 在对象中添加了一个y=123的变量。不能修改类中的。
    6. print(obj.y)
    7. obj.x = 123#在对象中添加x=123,类中的x还是==1。
    8. print(obj.x)#打印对象中的x==123
    9. print(Base.x)#打印的是类中的x==1
    10. #先在对象中找,然后再到类中寻找变量。
    1. class Parent:
    2. x = 1
    3. class Child1(Parent):
    4. pass
    5. class Child2(Parent):
    6. pass
    7. print(Parent.x,Child1.x,Child2.x) # 1 1 1
    8. Child1.x = 2
    9. print(Parent.x,Child1.x,Child2.x) # 1 2 1
    10. Child2.x = 3
    11. print(Parent.x,Child1.x,Child2.x) # 1 2 3

总结:找变量优先找自己,自己没有找 类 或 基类;修改或赋值只能在自己的内部设置。

  1. class Foo:
  2. x=1
  3. class Parent(Foo):
  4. pass
  5. obj=Parent()
  6. print(obj.x)
  7. obj.x=2
  8. print(Parent.x)
  9. print(obj.x)
  10. 1
  11. 1
  12. 2

1.3 方法(绑定方法/普通方法)

  • 定义:至少有一个self参数
  • 执行:先创建对象,由对象.方法()。
  1. class Foo:
  2. def func(self,a,b):
  3. print(a,b)
  4. obj = Foo()
  5. obj.func(1,2)
  6. # ###########################
  7. class Foo:
  8. def __init__(self):
  9. self.name = 123
  10. def func(self, a, b):
  11. print(self.name, a, b)
  12. obj = Foo()
  13. obj.func(1, 2)

1.4 静态方法

  • 定义:

    • @staticmethod装饰器
    • 参数无限制
  • 执行:
    • 类.静态方法名 ()
    • 对象.静态方法() (不推荐)
  1. class Foo:
  2. def __init__(self):
  3. self.name = 123
  4. def func(self, a, b):
  5. print(self.name, a, b)
  6. @staticmethod
  7. def f1():
  8. print(123)
  9. obj = Foo()
  10. obj.func(1, 2)
  11. Foo.f1()
  12. obj.f1() # 不推荐

1.5 类方法

  • 定义:

    • @classmethod装饰器
    • 至少有cls参数,当前类。
  • 执行:
    • 类.类方法()
    • 对象.类方法() (不推荐)
  1. class Foo:
  2. def __init__(self):
  3. self.name = 123
  4. def func(self, a, b):
  5. print(self.name, a, b)
  6. @staticmethod
  7. def f1():
  8. print(123)
  9. @classmethod
  10. def f2(cls,a,b):
  11. print('cls是当前类',cls)
  12. print(a,b)
  13. obj = Foo()
  14. obj.func(1, 2)
  15. Foo.f1()
  16. Foo.f2(1,2)

面试题:

  1. # 问题: @classmethod和@staticmethod的区别?
  2. """
  3. 一个是类方法一个静态方法。
  4. 定义:
  5. 类方法:用@classmethod做装饰器且至少有一个cls参数。
  6. 静态方法:用staticmethod做装饰器且参数无限制。
  7. 调用:
  8. 类.方法直接调用。
  9. 对象.方法也可以调用。
  10. """

1.6 属性

  • 定义:

    • @property装饰器
    • 只有一个self参数
  • 执行:
    • 对象.方法 不用加括号。
  1. class Foo:
  2. @property
  3. def func(self):
  4. print(123)
  5. return 666
  6. obj = Foo()
  7. result = obj.func
  8. print(result)
  1. # 属性的应用
  2. class Page:
  3. def __init__(self, total_count, current_page, per_page_count=10):
  4. self.total_count = total_count
  5. self.per_page_count = per_page_count
  6. self.current_page = current_page
  7. @property
  8. def start_index(self):
  9. return (self.current_page - 1) * self.per_page_count
  10. @property
  11. def end_index(self):
  12. return self.current_page * self.per_page_count
  13. USER_LIST = []
  14. for i in range(321):
  15. USER_LIST.append('alex-%s' % (i,))
  16. # 请实现分页展示:
  17. current_page = int(input('请输入要查看的页码:'))
  18. p = Page(321, current_page)
  19. data_list = USER_LIST[p.start_index:p.end_index]#省了p.start_index()中的括号。
  20. for item in data_list:
  21. print(item)

2.成员修饰符

  • 公有,所有地方都能访问到。
  • 私有,只有自己可以访问到。
  1. class Foo:
  2. def __init__(self, name):
  3. self.__name = name
  4. def func(self):
  5. print(self.__name)
  6. obj = Foo('alex')
  7. # print(obj.__name)#对象obj是外部,外部无法访问。所以此处输出错误。
  8. obj.func()#此处obj调用方法,方法打印出私有变量。
  1. class Foo:
  2. __x = 1
  3. @staticmethod
  4. def func():
  5. print(Foo.__x)
  6. # print(Foo.__x)
  7. Foo.func()
  1. class Foo:
  2. def __init__(self,name):
  3. self.__x=name
  4. def __fun(self):
  5. print('msg')
  6. def show(self):
  7. self.__fun()
  8. obj = Foo()
  9. # obj.__fun()#子类不可以访问父类中的私有东西。
  10. #py后门,如果强制想访问。print(obj._Foo__x)#赠送部分。
  11. obj.show()
  12. #只要前面加了双下划线,都是变成私有的了。私有的只有内部可以条用,外部如对象直接调用是不可以的。

3.补充

  1. class Foo:
  2. def __init__(self,num):
  3. self.num = num
  4. cls_list = []
  5. for i in range(10):
  6. cls_list.append(Foo)
  7. for i in range(len(cls_list)):
  8. obj = cls_list[i](i)
  9. print(obj.num)
  1. class Foo:
  2. def __init__(self,num):
  3. self.num = num
  4. B = Foo
  5. obj = B('alex')
  1. class Foo:
  2. def f1(self):
  3. print('f1')
  4. def f2(self):
  5. print('f2')
  6. obj = Foo()
  7. v = [ obj.f1,obj.f2 ]
  8. for item in v:
  9. item()
  1. class Foo:
  2. def f1(self):
  3. print('f1')
  4. def f2(self):
  5. print('f2')
  6. def f3(self):
  7. v = [self.f1 , self.f2 ]
  8. for item in v:
  9. item()
  10. obj = Foo()
  11. obj.f3()
  1. class Account:
  2. def login(self):
  3. pass
  4. def register(self):
  5. pass
  6. def run(self):
  7. info = {'1':self.register, '2':self.login }
  8. choice = input('请选择:')
  9. method = info.get(choice)
  10. method()
  1. class Foo:
  2. pass
  3. class Foo(object):
  4. pass
  5. # 在python3中这俩的写法是一样,因为所有的类默认都会继承object类,全部都是新式类。
  6. # 如果在python2中这样定义,则称其为:经典类
  7. class Foo:
  8. pass
  9. # 如果在python2中这样定义,则称其为:新式类
  10. class Foo(object):
  11. pass
  12. class Base(object):
  13. pass
  14. class Bar(Base):
  15. pass
  1. # 强制访问私有成员
  2. class Foo:
  3. def __init__(self,name):
  4. self.__x = name
  5. obj = Foo('alex')
  6. print(obj._Foo__x) # 强制访问私有实例变量

总结

  1. 数据封装

  2. 继承关系的查找

  3. 嵌套

    1. class School(object):
    2. def __init__(self,title,addr):
    3. self.title = title
    4. self.address = addr
    5. class ClassRoom(object):
    6. def __init__(self,name,school_object):
    7. self.name = name
    8. self.school = school_object
    9. s1 = School('北京','沙河')
    10. s2 = School('上海','浦东')
    11. s3 = School('深圳','南山')
    12. c1 = ClassRoom('全栈21期',s1)
    13. c1.name
    14. c1.school.title
    15. c1.school.address
    16. # ############################################
    17. v = [11,22,33,{'name':'山海','addr':'浦东'}]
    18. v[0]
    19. v[3]['name']

python笔记20(面向对象课程二)的更多相关文章

  1. 二十. Python基础(20)--面向对象的基础

    二十. Python基础(20)--面向对象的基础 1 ● 类/对象/实例化 类:具有相同属性.和方法的一类人/事/物 对象(实例): 具体的某一个人/事/物 实例化: 用类创建对象的过程→类名(参数 ...

  2. 8.python笔记之面向对象基础

    title: 8.Python笔记之面向对象基础 date: 2016-02-21 15:10:35 tags: Python categories: Python --- 面向对象思维导图 (来自1 ...

  3. Python:笔记(3)——面向对象编程

    Python:笔记(3)——面向对象编程 类和面向对象编程 1.类的创建 说明:和Java不同的是,我们不需要显示的说明类的字段属性,并且可以在后面动态的添加. 2.构造函数 构造函数的功能毋庸置疑, ...

  4. Python进阶之面向对象编程(二)

    Python面向对象编程(二) .note-content {font-family: "Helvetica Neue",Arial,"Hiragino Sans GB& ...

  5. python之路---面向对象编程(二)

    类的继承 1.在python3中,只有新式类,新式类的继承方式为:广度优先.而python2中,经典类的继承方式为:深度优先.那么我们来看看深度优先和广度优先的区别吧 如下图,为类之间的继承关系.B, ...

  6. python笔记-20 django进阶 (model与form、modelform对比,三种ajax方式的对比,随机验证码,kindeditor)

    一.model深入 1.model的功能 1.1 创建数据库表 1.2 操作数据库表 1.3 数据库的增删改查操作 2.创建数据库表的单表操作 2.1 定义表对象 class xxx(models.M ...

  7. python基础之面向对象(二)(封装、继承、多态)

    一.封装 (1)封装是面向对象的一大特点 (2)面向对象编程的第一步--将属性和方法封装到一个抽象的类当中 (3)外界使用类创建对象,然后让对象调用方法 (4)对象方法的细节都被封装在类的内部 1.案 ...

  8. 9.Python笔记之面向对象高级部分

    类的成员 类的成员可以分为三大类:字段.方法和属性 注:所有成员中,只有普通字段的内容保存对象中,即:根据此类创建了多少对象,在内存中就有多少个普通字段.而其他的成员,则都是保存在类中,即:无论对象的 ...

  9. python粗谈面向对象(二)

    浅谈super() super并不是一个函数,是一个类名,形如super(B, self)事实上调用了super类的初始化函数,产生了一个super对象:Python的多继承类是通过mro的方式来保证 ...

随机推荐

  1. H5Demo_password_generator

    原项目资源地址: https://www.html5tricks.com/js-passwd-generator.html codepen地址: https://codepen.io/deuscx/p ...

  2. 【01】HTML_day01_02-认识HTML

    typora-copy-images-to: media 第01阶段.前端基础.认识HTML 学习目标 理解 HTML的概念 HTML标签的分类 HTML标签的关系 HTML标签的语义化 应用 HTM ...

  3. shell脚本监测进程并重启

    本人实例: #!/bin/bash ps -ef | grep elastic | grep -v grepif [ $? -ne 0 ]thenecho "start process... ...

  4. MySQL 8 备份与恢复

    备份应用的场景包括:系统崩溃.硬件故障.用户错误.升级MySQL Installation.传输MySQL Installation到另一台机器.设置复制等. Slave Server备份 在备份Sl ...

  5. Protobuf用法

    官方文档 什么是 protocol buffer? Protocol buffers are a flexible, efficient, automated mechanism for serial ...

  6. MySQL优化、锁

    1.  MySQL优化-查看执行记录 MySQL 提供了一个 EXPLAIN 命令, 它可以对 SELECT 语句进行分析, 并输出 SELECT 执行的详细信息, 以供开发人员针对性优化. 使用ex ...

  7. 解决const char* to char* 的错误

    一般情况下 char* string = "abc"; 编译后会出现标题中的错误. 我们只需要在字符串前加上const_cast<char*>即可,这个作用是丢弃变量的 ...

  8. Java中List的父类与子类如何转换?

    目录 定义 要点: 子类转父类 父类转子类 定义 A是B的子类,A比B多几条属性 要点: A是B的子类,但List<A>不是List<B>的子类.所以想直接转换是不行的. 子类 ...

  9. C# Socket的方式发送中文,接收方收到乱码

    场景: 使用 Socket的方式向下位机发送中文信息,下位机收到的中文是乱码 原因: 了解到的原因是上位机与下位机的发送与接收的编码与解码方式不一致 比如上位机采用 Encoding.UTF8.Get ...

  10. Redis的各个数据的类型基本命令

    什么是Redis: 概念: Redis (REmote DIctionary Server) 是用 C 语言开发的一个开源的高性能键值对(key-value)数据库. 特征:1. 数据间没有必然的关联 ...