今日内容

  • 类成员
  • 成员修饰符

内容回顾 & 补充

  1. 三大特性

    • 封装

      • 函数封装到类

      • 数据封装到对象 *

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

    • 多态

内容详细

1.成员

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

1.1 实例变量

class Foo:
def __init__(self,name):
self.name=name
def func(self):
print(self.name) obj1=Foo('ALEX')
obj1.func()
obj2=Foo('ERIC')
obj2.func()

1.2 类变量

class Foo:
city='武汉'
def __init__(self,name):
self.name=name
def func(self):
pass
obj1=Foo('ALEX')
print(obj1.name)
print(obj1.city)
print(Foo.city)
obj2=Foo('ERIC')
print(obj2.name)
print(obj2.city)
print(Foo.city) ALEX
武汉
武汉
ERIC
武汉
武汉
  • 定义:写在类的下一级和方法同一级。

  • 访问:

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

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

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

class Foo:
x=1
class Parent(Foo):
pass
obj=Parent()
print(obj.x)
obj.x=2
print(Parent.x)
print(obj.x) 1
1
2

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

  • 定义:至少有一个self参数
  • 执行:先创建对象,由对象.方法()。
class Foo:
def func(self,a,b):
print(a,b) obj = Foo()
obj.func(1,2)
# ###########################
class Foo:
def __init__(self):
self.name = 123 def func(self, a, b):
print(self.name, a, b) obj = Foo()
obj.func(1, 2)

1.4 静态方法

  • 定义:

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

1.5 类方法

  • 定义:

    • @classmethod装饰器
    • 至少有cls参数,当前类。
  • 执行:
    • 类.类方法()
    • 对象.类方法() (不推荐)
class Foo:
def __init__(self):
self.name = 123 def func(self, a, b):
print(self.name, a, b) @staticmethod
def f1():
print(123) @classmethod
def f2(cls,a,b):
print('cls是当前类',cls)
print(a,b) obj = Foo()
obj.func(1, 2) Foo.f1()
Foo.f2(1,2)

面试题:

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

1.6 属性

  • 定义:

    • @property装饰器
    • 只有一个self参数
  • 执行:
    • 对象.方法 不用加括号。
class Foo:

    @property
def func(self):
print(123)
return 666 obj = Foo()
result = obj.func
print(result)
# 属性的应用

class Page:
def __init__(self, total_count, current_page, per_page_count=10):
self.total_count = total_count
self.per_page_count = per_page_count
self.current_page = current_page
@property
def start_index(self):
return (self.current_page - 1) * self.per_page_count
@property
def end_index(self):
return self.current_page * self.per_page_count USER_LIST = []
for i in range(321):
USER_LIST.append('alex-%s' % (i,)) # 请实现分页展示:
current_page = int(input('请输入要查看的页码:'))
p = Page(321, current_page)
data_list = USER_LIST[p.start_index:p.end_index]#省了p.start_index()中的括号。
for item in data_list:
print(item)

2.成员修饰符

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

3.补充

class Foo:
def __init__(self,num):
self.num = num cls_list = []
for i in range(10):
cls_list.append(Foo) for i in range(len(cls_list)):
obj = cls_list[i](i)
print(obj.num)
class Foo:
def __init__(self,num):
self.num = num B = Foo
obj = B('alex')
class Foo:
def f1(self):
print('f1') def f2(self):
print('f2') obj = Foo() v = [ obj.f1,obj.f2 ]
for item in v:
item()
class Foo:
def f1(self):
print('f1') def f2(self):
print('f2') def f3(self):
v = [self.f1 , self.f2 ]
for item in v:
item() obj = Foo()
obj.f3()
class Account:

    def login(self):
pass def register(self):
pass def run(self):
info = {'1':self.register, '2':self.login }
choice = input('请选择:')
method = info.get(choice)
method()
class Foo:
pass class Foo(object):
pass # 在python3中这俩的写法是一样,因为所有的类默认都会继承object类,全部都是新式类。 # 如果在python2中这样定义,则称其为:经典类
class Foo:
pass
# 如果在python2中这样定义,则称其为:新式类
class Foo(object):
pass class Base(object):
pass
class Bar(Base):
pass
# 强制访问私有成员

class Foo:
def __init__(self,name):
self.__x = name obj = Foo('alex') print(obj._Foo__x) # 强制访问私有实例变量

总结

  1. 数据封装

  2. 继承关系的查找

  3. 嵌套

    class School(object):
    def __init__(self,title,addr):
    self.title = title
    self.address = addr class ClassRoom(object): def __init__(self,name,school_object):
    self.name = name
    self.school = school_object s1 = School('北京','沙河')
    s2 = School('上海','浦东')
    s3 = School('深圳','南山') c1 = ClassRoom('全栈21期',s1)
    c1.name
    c1.school.title
    c1.school.address
    # ############################################
    v = [11,22,33,{'name':'山海','addr':'浦东'}] v[0]
    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. Play! 1.x Eclipse Debug调试报错解决方法记录

    使用Play eclipsify xxxx[项目路径],可以把play new xxxx[项目路径]创建的工程生成为Eclipse的项目 但是在Debug AS 调试的时候,会报以下错误 Error ...

  2. 展讯平台uboot启动流程

    启动流程 1. Stage1 start.S代码结构 u-boot的stage1代码通常放在start.S文件中,用汇编语言,主要实现功能如下:  (1) 定义入口: 该工作通过修改连接器脚本来完成. ...

  3. 如何在Mac和Windows PC之间无线共享文件

    有时候,我需要在Mac和PC之间无线共享文件.由于并非所有人都在使用macOS,因此无论是在办公室还是在家里,这种情况都会发生.尽管并非一帆风顺,但有一种无需任何第三方应用程序即可弥合差距的方法. 根 ...

  4. 异步处理MultipartFile No such file or directory的分析

    背景 项目中开发导入功能,因为数据量比较大,所以要求后端异步操作(个人觉得前端ajax处理最好,有空再试一下).但是操作中发现改为异步之后,相同代码的情况下会报(No such file or dir ...

  5. 退役记——CCC2020&CCO2020

    我叫吴佳诚,一个曾在福建师大附中就读的oier,2019年7月份我来到多伦多就读于Langstaff Secondary School 我的常用id有:Johnson_Wu,温词 竞赛经历: 2018 ...

  6. 鼠标经过INPUT时自动获取焦点

    鼠标经过INPUT时自动获取焦点 <input type="text" name="addr" onMouseOver="this.focus( ...

  7. 浅谈python的第三方库——pandas(二)

    pandas使用小贴士 1 通过Series创建DataFrame 在pandas系列的第一篇博文中曾提到,Series可视为DataFrame的一种特例,即只有一列数据.既然如此,是否可以并列多个S ...

  8. 数据结构(集合)学习之Map(二)

    集合 框架关系图 补充:HashTable父类是Dictionary,不是AbstractMap. 一:HashMap中的链循环: 一般来说HashMap中的链循环会发生在多线程操作时(虽然HashM ...

  9. burpsuite抓取小程序的数据包(指定DNS)

    目标:burpsuite抓取微信小程序的数据包,而且该系统需指定DNS!否则无法访问! 大家都知道小程序是https传输的,所以手机端是需要安装burp证书的. 已忽略安装证书的步骤,可自己百度搜索, ...

  10. MySQL 8 服务器组件

    MySQL 服务器包含了一个基于组件的架构,用于扩展服务器功能.服务器和其他组件可以使用组件提供的服务.(在使用服务方面,服务器也是一个组件,等同于其他组件).组件之间交互仅通过他们各自提供的服务. ...