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. java爬虫系列第一讲-爬虫入门

    1. 概述 java爬虫系列包含哪些内容? java爬虫框架webmgic入门 使用webmgic爬取 http://ady01.com 中的电影资源(动作电影列表页.电影下载地址等信息) 使用web ...

  2. UML学习——类之间的关系

    参考:UML图中类之间的关系:依赖,泛化,关联,聚合,组合,实现 空心菱形为聚合关系:部分与整体,部分可有可无.部分可以单独存在(车子和引擎,引擎可以单独存在) 实心菱形为组合关系:部分与整体,但是部 ...

  3. 豆瓣top250(go版以及python版)

      最近学习go,就找了一个例子练习[go语言爬虫]go语言爬取豆瓣电影top250,思路大概就是获取网页,然后根据页面元素,用正则表达式匹配电影名称.评分.评论人数.原文有个地方需要修改下patte ...

  4. Oracle字符到数值转换错误

    [错误] [问题分析] line 3: 定义 NUM_VAL varchar2(500); line 9: NUM_VAL := 'NUM'+1; NUM_VAL是一个varchar类型的数据,而在数 ...

  5. 应用shell脚本停启Tomcat

    最近在工作中频繁的操作多个tomcat,顺便就简单研究了一下 一. 简介 Shell 是一种与操作系统直接交互的程序,Unix系统中叫Bourne Shell,包括以下几种 Sh—Bourne She ...

  6. 经度和纬度在SQL中的数据类型

    冬天太冷,等坐公司班车也很冷,就萌生了给班车做一个到站查询功能. 在某宝上买了汽车在线的GPS设备, 终生免费的服务的. 这里不得不提下这个设备的优点, 它提供API接口,还是免费的. 所以在班车上装 ...

  7. 调研行为树jbt

    最近要做游戏ai,看了一下行为树的东西,因为用的java,所以主要看了jbt: https://github.com/gaia-ucm/jbt 这玩意分编辑器JBTEditor和核心库JBTCore两 ...

  8. ubuntu如何安装chromium浏览器并设置成中文版

    在Ubuntu上使用APT安装Chromium有3种方法: 1.在Ubuntu软件中心输入chromium,然后在结果中选择安装即可. 2.在新立得软件包管理器中输入chromium,然后标记安装即可 ...

  9. apache ranger源码编译

    官方文档 http://ranger.apache.org/quick_start_guide.html Quick Start Guide Build Process 1. Check out th ...

  10. 利用gulp,当引入文件改动时,版本号自动更新~

    gulp自动更新版本号 安装依赖 yarn add gulp-rev yarn add gulp-rev-collector 本次依赖的版本号为: "gulp": "^3 ...