1.成员

  • 类成员

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

1.1实例变量

  • 类实例化后的对象内部的变量

![1556087212183](C:\Users\big cattle\AppData\Roaming\Typora\typora-user-images\1556087212183.png)

1.2类变量

  • 类中的变量,写在类的下一级和方法同一级。

  • 访问方法:

    • 类.类变量名称(推荐)
    • 对象.类变量名称

    ![1556087428193](C:\Users\big cattle\AppData\Roaming\Typora\typora-user-images\1556087428193.png)

  • 面试题:

    • 总结:找变量优先找自己,自己没有找 类 或 基类;修改或赋值只能在自己的内部设置。
    class Base:
    x = 1 obj = Base() print(obj.x) # 先去对象中找,没有再去类中找。
    obj.y = 123 # 在对象中添加了一个y=123的变量。
    print(obj.y)
    obj.x = 123
    print(obj.x)
    print(Base.x)

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]
    for item in data_list:
    print(item)

2.成员修饰符

2.1 公有

  • 公有,所有地方都能访问到。

    class Foo:
    def __init__(self, name):
    self.__name = name def func(self):
    print(self.__name) obj = Foo('alex')
    # print(obj.__name)
    obj.func()

2.2 私有

  • 私有,只有自己可以访问到。

    class Foo:
    __x = 1 @staticmethod
    def func():
    print(Foo.__x) # print(Foo.__x)
    Foo.func() #---------------------------------------------
    class Foo: def __fun(self):
    print('msg') def show(self):
    self.__fun() obj = Foo()
    # obj.__fun()
    obj.show()

2.3强制访问私有成员

# 强制访问私有成员

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

3.内容补充

  • py2/3区别:

  • 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,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 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学习day20 面向对象(二)类成员&成员修饰符的更多相关文章

  1. python学习之面向对象(二)

    6.2 类的空间角度研究类 6.2.1 添加对象属性 [总结]对象的属性不仅可以在__init__里面添加,还可以在类的其他方法或者类的外面添加. class A: address = '召唤师峡谷' ...

  2. Python学习之==>面向对象编程(二)

    一.类的特殊成员 我们在Python学习之==>面向对象编程(一)中已经介绍过了构造方法和析构方法,构造方法是在实例化时自动执行的方法,而析构方法是在实例被销毁的时候被执行,Python类成员中 ...

  3. python基础(27):类成员的修饰符、类的特殊成员

    1. 类成员的修饰符 类的所有成员在上一步骤中已经做了详细的介绍,对于每一个类的成员而言都有两种形式: 公有成员,在任何地方都能访问 私有成员,只有在类的内部才能方法 私有成员和公有成员的定义不同:私 ...

  4. python基础之面向对象(二)

    一点提醒 首先在使用pickle读取load时,需要先把使用到的类import上,否则会报错.在pycharm中使用时不会报错,但在linux或者cmd时就会报错!必须import. 报错提示: Fi ...

  5. python进阶01 面向对象、类、实例、属性封装、实例方法

    python进阶01 面向对象.类.实例.属性封装.实例方法 一.面向对象 1.什么是对象 #一切皆对象,可以简单地将“对象”理解为“某个东西” #“对象”之所以称之为对象,是因为它具有属于它自己的“ ...

  6. java中的类修饰符、成员变量修饰符、方法修饰符。

    类修饰符: public(访问控制符),将一个类声明为公共类,他可以被任何对象访问,一个程序的主类必须是公共类. abstract,将一个类声明为抽象类,没有实现的方法,需要子类提供方法实现. fin ...

  7. VS开发入门三:c#的类的修饰符和成员的修饰符

    初学者经常会犯下的错误就是,修饰符一大堆,而且类和其成员很多修饰符是一样的容易混用 这里总结下 C#修饰符之类修饰符(个 助记 PIPA SS ):public.internal. partial(多 ...

  8. 12、类成员访问修饰符public/private/producted/readonly

    1.private 类的私有成员 private 类的私有成员,只能在内部访问,在外部访问不到,无法被继承,我们可以将不需要被外部修改的定义为私有的 私有成员,只能在内部访问,在外部访问不到 priv ...

  9. Python学习笔记(二)——列表

    Python学习笔记(二)--列表 Python中的列表可以存放任何数据类型 >>> list1 = ['Hello','this','is','GUN',123,['I','Lov ...

随机推荐

  1. maven的安装和环境配置

    一.下载maven Apache Maven下载地址:http://maven.apache.org/download.cgi 二.maven的安装 将下载好的安装文件解压到d盘根目录下即可(当然,这 ...

  2. 我的Python之旅第六天--面向对象初识

    一.概念 类:是具有相同属性的技能的一类实物 对象:实例化的一个类,是类的具体体现 class Person: '''内容''' animal='高级动物' soul='有思想' #animal,so ...

  3. hadoop集群的搭建

    hadoop集群的搭建 1.ubuntu 14.04更换成阿里云源 刚刚开始我选择了nat模式,所有可以连通网络,但是不能ping通,我就是想安装一下mysql,因为安装手动安装mysql太麻烦了,然 ...

  4. 清理mac的硬盘空间,清理Xcode,清除“其他”

    下面是一些清理的方法:打开Finder使用快捷键command+shift+g输入路径即可进入该文件夹 1. 移除DerivedData,建议定期清理,会重新生成 此文件夹内是模拟器运行每个APP生成 ...

  5. 一种动态写入apk数据的方法(用于用户关系绑定、添加渠道号等)

    背景: 正在开发的APP需要记录业务员与客户的绑定关系.具体应用场景如下: 由流程图可知,并没有用户填写业务人员信息这一步,因此在用户下载的APP中就已经携带了业务人员的信息. 由于业务人员众多,不可 ...

  6. 基于Android的模拟点击探索

    前言 压力测试中,一般会用到自动化测试.准备写一个APP,可以记录屏幕上的点击事件,然后通过shell命令来模拟自动执行.shell指令,比较容易实现.那么,关键的一步是获取点击的坐标.对于Andro ...

  7. Hadoop Yarn框架原理解析

    在说Hadoop Yarn的原理之前,我们先来看看Yarn是怎样出现的.在古老的Hadoop1.0中,MapReduce的JobTracker负责了太多的工作,包括资源调度,管理众多的TaskTrac ...

  8. 扫码下单与ERP客户端锁桌功能FAQ

    一.需求场景:因为目前客户端和平台端有两套数据库,两套数据库通过网络交互信息,且双方都可以发起支付,这种结构容易造成: 1.一笔订单同时支付.一笔订单支付时未按最新订单进行支付,支付多付.支付少付的情 ...

  9. Puppeteer学习之小试牛刀

    最近有了写文章的动力了,一方面是受到了很多前辈们的启示,另一方面也是为了记录下来更好地学以致用.闲言少叙,先说说Puppeteer是什么. Puppeteer是一个node库,提供了一些用来操作Chr ...

  10. 从0开始的Python学习013编写一个Python脚本

    通过之前的学习我们已经了解了Python的很多基础运用了,现在我们尝试着做一个有使用价值的小脚本. 问题 需求: 我想要一个可以给我备份重要文件的程序. 需求分析: 首先文件是有存储路径,文件的路径和 ...