今日内容

  • 类成员
  • 成员修饰符

内容回顾 & 补充

  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. npm常用命令和脚手架使用

    最近前端同学使用最多的莫过于vue,angualr,react等热门前端框架了.那么就避免不掉的使用npm命令,本人就经常因为这三个脚手架的使用而不得不百度相应的npm命令,不胜其烦,,,因此就整理一 ...

  2. JS DOM属性,包括固有属性和自定义属性,以及属性获取、移除和设置

    属性分为固有属性property和自定义属性attribute 固有属性查看 固有属性可以通过ele.property 来获取,自定义属性不行 <!DOCTYPE html> <ht ...

  3. C# MVC 中自定义权限特性[Authorize]中对于Ajax访问的处理

    在MVC中定义自己的权限特性. 下例中是简单的登录判断,登录信息存与Session中,如果Session中没有登录信息,那么就不通过. 在处理无权限的时候,判断当前请求是否为Ajax请求,如果是Aja ...

  4. MySQL表名大小写敏感性

    Linux版MySQL 库名与表名是严格区分大小写的: 表的别名是严格区分大小写的: 列名与列的别名在所有的情况下均是忽略大小写的: 变量名也是严格区分大小写的: 修改步骤如下: 1. 编辑[/etc ...

  5. NODEJS 中使用二维码 qr-image

    https://www.npmjs.com/package/qr-image npm install qr-image var qr = require('qr-image'); var code = ...

  6. 思科命令 service password-encryption

    service password-encryption 将会把所有password用思科私有方式加密, 标记是 7,show run 查看密码时,5为md5加密结果即secret, no servic ...

  7. processing data

    获取有效数据 Scikit-learn will not accept categorical features by default API里面不知使用默认的特征变量名,因此需要编码 这里我还是有疑 ...

  8. Linux 宝塔面板忘记密码的解决方案

    进入ssh 输入以下命令重置密码(把命令最后面的   “testpasswd”  替换成你要改的新密码)注:若是debian/ubuntu用户,请使用有root权限的账户去执行这条命令 cd /www ...

  9. PAT (Advanced Level) Practice 1027 Colors in Mars (20 分)

    People in Mars represent the colors in their computers in a similar way as the Earth people. That is ...

  10. 07-SV线程以及线程间的通信

    1.几种语句块的区别 (1)fork……join:块内语句以并发方式执行 (2)begin……end:块内语句以顺序方式执行 (3)fork……join_none:其块内语句执行时,父线程继续执行 ( ...