https://www.cnblogs.com/liubing8/p/11325421.html

1. 私有成员

  1. 私有类的属性:在内部可以访问(本类内部方法中),类的外部不能访问

    代码示例:

    # 在内部可以访问(本类内部方法中)
    class A:
    name = '张三'
    __name = '李四' # 私有类的属性
    def func(self):
    print(self.name)
    print(self.__name)
    obj = A()
    obj.func() # 类的外部不能访问
    class A:
    name = '张三'
    __name = '李四' # 私有类的属性
    def func(self):
    pass
    obj = A()
    print(obj.name)
    print(A.__name) # 报错
    print(obj.__name) # 报错
  2. 私有对象属性:只能在类的内部使用,不能在外部及派生类中使用

    代码示例:

    class A:
    name = '张三'
    __name = '李四' class B(A):
    def func(self):
    print(self.__name) obj = B()
    print(obj.__name) # 不可以
    obj.func() # 不可以
  3. 私有类的方法:只能在类的内部使用,不能在外部及派生类中使用

    代码示例:

    class A:
    
        def func(self):
    self.__func()
    print('in A func') def __func(self):
    print('in A __func') obj = A()
    obj.func() # 可以
    obj.__func() # 不可以
  4. 对于私有类成员来说:当你遇到重要的数据/功能,(只允许本类使用的一些方法,数据)设置成私有成员
  5. Python中所有私有成员都是纸老虎,形同虚设,类在加载时,只要遇到类中的私有成员,都会在私有成员前面加上_类名

    代码示例:

    class A:
    
        name = '张三'
    __name = '李四' # 私有类的属性 def __func(self):
    print('in __func') print(A.__dict__)
    print(A._A__name)

2. 类方法

方法包括:普通方法、静态方法和类方法,三种方法在内存中都归属于类,区别在于调用方式不同。

  • 类方法:一般就是通过类名去调用的方法,并且自动将类名地址传给cls,如果通过对象调用也可以,但是传的地址还是类名地址,并不是所有实例化都是在类外面

  • 类方法的作用:得到类名可以实例化对象,可以操作类的属性

  • 定义:使用装饰器@classmethod.第一个参数必须是当前类对象,该参数名一般约定为“cls”,通过它来传递类的属性和方法(不能传实例的属性和方法)

  • 代码示例:

    class A:
    def func(self):
    print('实例方法')
    @classmethod
    def cls_func(cls):
    print(f'cls---->{cls}')
    print('类方法')
    print(A)
    A.cls_func()
    obj = A()
    obj.cls_func()
  • 应用示例:创建学生类,只要实例化一个对象,写一个类方法,统计一下具体实例化多少个学生?

    class Student:
    count = 0
    def __init__(self,name,id):
    self.name = name
    self.id = id
    Student.addnum()
    @classmethod
    def addnum(cls):
    cls.count = cls.count + 1
    @classmethod
    def getnum(cls):
    return cls.count obj1 = Student('张三', 12343243243)
    obj2 = Student('李四', 12343243243)
    obj3 = Student('王五', 12343243243) print(Student.getnum())

3. 静态方法

  • 静态方法:不依赖对象与类的,其实静态方法就是函数

  • 作用:保证代码的规范化,合理的划分,后续维护性高

  • 定义:使用装饰器@staticmethod.参数随意,没有“self”和“cls”参数,但是方法体中不能使用类或实例的任何属性和方法

  • 代码示例:

    import time
    class TimeTest(object):
    def __init__(self, hour, minute, second):
    self.hour = hour
    self.minute = minute
    self.second = second
    @staticmethod # 相当于函数的作用
    def showTime():
    return time.strftime("%H:%M:%S", time.localtime())
    print(TimeTest.showTime())
    t = TimeTest(2, 10, 10)
    nowTime = t.showTime()
    print(nowTime)

4. 属性

  • 属性:property将执行一个函数需要函数名(),换成直接函数名
    将动态方法伪装成一个属性,虽然在代码级别上没有什么提升,但是让你看起来更合理

  • 代码示例:

    class Bmi:
    def __init__(self,name,height,weight):
    self.name = name
    self.height = height
    self.weight = weight
    def bmi(self):
    return self.weight/self.height**2
    obj = Bmi(张三', 1.83, 65)
    print(obj.bmi())
    
    
    # 结果虽然实现了,但是逻辑上感觉不合理.bmi应该是类似于name,age,height等名词,但是把它当做方法使用了.
    class Bmi:
    def __init__(self,name,height,weight):
    self.name = name
    self.height = height
    self.weight = weight
    @property
    def bmi(self):
    return self.weight/self.height**2
    obj = Bmi('张三', 1.83, 65)
    print(obj.bmi) # property 将执行一个函数需要函数名()变换成直接函数名.
    # 将动态方法 伪装 成了一个属性,虽然在代码级别上没有什么提升,但是让你看起来更合理.
  • property 是一个组合

    class Foo:
    @property
    def bmi(self):
    print('get的时候运行我啊')
    @bmi.setter
    def bmi(self,value):
    print(value)
    print('set的时候运行我啊')
    # return 111 # 无法得到返回值
    @bmi.deleter
    def bmi(self):
    print('delete的时候运行我啊')
    # return 111 # 无法得到返回值
    obj = Foo()
    obj.bmi
    obj.bmi = 666 # 操作命令 这个命令并不是改变bmi的值,而是执行被bmi.setter装饰器装饰的函数
    obj.bmi(666) # 报错
    del obj.bmi # 结果:
    get的时候运行我啊
    666
    set的时候运行我啊
    delete的时候运行我啊

    设置属性的两种方式:

    # 1. 利用装饰器设置属性.
    class Foo:
    @property
    def bmi(self):
    print('get的时候运行我啊') @bmi.setter
    def bmi(self,value):
    print(value)
    print('set的时候运行我啊')
    # return 111 # 无法得到返回值 @bmi.deleter
    def bmi(self):
    print('delete的时候运行我啊')
    # return 111 # 无法得到返回值 2. 利用实例化对象的方式设置属性.
    class Foo:
    def get_AAA(self):
    print('get的时候运行我啊')
    def set_AAA(self,value):
    print('set的时候运行我啊')
    def delete_AAA(self):
    print('delete的时候运行我啊')
    AAA = property(get_AAA,set_AAA,delete_AAA) #内置property三个参数与get,set,delete一一对应
    f1=Foo()
    f1.AAA
    f1.AAA='aaa'
    del f1.AAA

5. 内置函数 isinstance issubclass

  • isinstance 判断的是对象与类的关系

    class A:
    pass
    class B(A):
    pass
    obj = B() # isinstance(a,b) 判断的是 a是否是b类 或者 b类派生类 实例化的对象.
    print(isinstance(obj, B)) # True
    print(isinstance(obj, A)) # True
  • issubclass 判断的是类与类之间的关系

    class A:
    pass
    class B(A):
    pass
    class C(B):
    pass # issubclass(a,b) 判断的是 a类是否是b类的派生类 或者 b类派生类 的派生类.
    # issubclass(a,b) 判断的是 a类是否是b类 子孙类.
    print(issubclass(B,A))
    print(issubclass(C,A))

6. 总结:

  1. 对象如果改变了类的静态属性, 具体他进行了什么操作?
    将类中的静态属性变成可变的数据类型.
    对象调用类的方法,方法中对类的属性进行改变.

  2. 对象不能修改类的属性,示例代码如下:

    class A:
    a = 1
    b = 2
    def __init__(self):
    c = 3
    obj1 = A()
    obj2 = A()
    obj1.a = 3
    obj2.b = obj2.b + 3 print(A.a) #
    print(obj1.b) #
    print(obj2.b) #
    print(obj2.c) #报错

python 面向对象专题(五):私有成员、类方法、静态方法、属性、isinstance/issubclass的更多相关文章

  1. Python进阶----类的结构(公有成员 , 私有成员(私有属性,私有方法),类方法,静态方法,属性) ,isinstance 和issubcalss ,元类(type())

    Python进阶----类的结构(公有成员 , 私有成员(私有属性,私有方法),类方法,静态方法,属性) ,isinstance 和issubcalss ,元类(type()) 一丶类的结构细分    ...

  2. 『无为则无心』Python面向对象 — 51、私有成员变量(类中数据的封装)

    目录 1.私有成员变量介绍 (1)私有成员变量概念 (2)私有成员变量特点 (3)私有成员变量体验 2.属性私有化工作原理 3.定义成员变量的标识符规范 4.私有成员变量的获取和设置方式 1.私有成员 ...

  3. 面向对象~~类的成员: 私有成员,公有成员, 实例方法, 类方法, 静态方法, 属性(property), isinstance ,issubclass, 元类(type)

    一 私有成员公有成员 公有成员: 在任何地方都能访问 私有成员: 只有在类的内部才能访问 类从加载时,只要遇到类中的私有成员,都会在私有成员前面加上_类名 二 实例方法 实例方法就是类的实例能够使用的 ...

  4. Python面向对象之结构与成员

    1.面向对象结构分析: ----面相对象整体大致分为两块区域: --------第一部分:静态字段(静态变量)部分 --------第二部分:方法部分 --每个大区域可以分为多个小部分: class ...

  5. python 面向对象专题(一):面向对象初识、面向对象结构、类、self、实例化对象

    https://www.cnblogs.com/liubing8/p/11301344.html 目录 Python面向对象01 /面向对象初识.面向对象结构.类.self.实例化对象 1. 面向对象 ...

  6. 『无为则无心』Python面向对象 — 52、私有成员方法(类中行为的封装)

    Python对于类的成员没有严格的访问控制限制,这与其他面向对象的编程语言是有所区别的. 关于私有方法其实和私有属性差不多,有如下要点: 1.通常我们约定,两个下划线开头的方法是私有方法. 2.类内部 ...

  7. python 面向对象(类的特殊成员)

    python 面向对象: (思维导图 ↑↑↑↑) 类的特殊成员 python的类成员存在着一些具有特殊含义的成员 1.__init__: 类名() 自动执行 __init__ class Foo(ob ...

  8. python 面向对象专题(十):特殊方法 (三)__get__、__set__、__delete__ 描述符(三)方法是描述符

    在类中定义的函数属于绑定方法(bound method),因为用户定义的函数都有 __get__ 方法,所以依附到类上时,就相当于描述符.示例 20-13 演示了从 面向对象专题(九)示例 20-8 ...

  9. python 面向对象专题(七):异常处理

    目录 python面向对象07/异常处理 1. 异常错误分类 2. 什么是异常? 3. 异常处理 4. 为什么要有异常处理 5. 异常处理的两种方式 1.if判断 2.try 6. 常见异常种类 1. ...

随机推荐

  1. Divisors (求解组合数因子个数)【唯一分解定理】

    Divisors 题目链接(点击) Your task in this problem is to determine the number of divisors of Cnk. Just for ...

  2. MySQL示例数据库导入_1

    做个测试需要有适当量的数据库,于是找到了下面这个MySQL(超过30w记录), 1)先Git clone https://github.com/datacharmer/test_db         ...

  3. CISCN 2019-ikun

    0x01 进去网址,页面如下: 刚开始有个登陆和注册的按钮,上图是我已经注册后登陆成功后的页面,我们发现在图的左下角给了一个关键的提示,购买LV6,通过寻找我们发现页面数很多,大概500页,一个一个找 ...

  4. Spring系列.AOP使用

    AOP简介 利用面向对象的方法可以很好的组织代码,也可以继承的方式实现代码重用.但是项目中总是会出现一些重复的代码,并且不太方便使用继承的方式把他们重用管理起来,比如说通用日志打印,事务处理和安全检查 ...

  5. 【JMeter_03】JMeter GUI操作界面介绍

    JMeter主界面主要分为 标题栏.菜单栏.工具栏.测试计划树形目录.内容展示区 标题栏:主要展示JMeter的程序版本.当前脚本的名称.脚本的储存路径 菜单栏:程序基本上所有功能的所属分类目录,基本 ...

  6. C++ 基于多态的职工管理系统

    职工管理系统 1.管理系统需求 职工管理系统可以用来管理公司内所有员工的信息 本教程主要利用C++来实现一个基于多态的职工管理系统 公司中职工分为三类:普通员工.经理.老板,显示信息时,需要显示职工编 ...

  7. C/C++语言的学习方向

    这个世界上有太多的坑,如果我们不具备查阅资料的能力和对现实世界的思考能力,入坑是大概率的事情. C/C++语言能做什么?C/C++程序员在做什么?企业需要什么样的C/C++程序员?对初学者来说,要搞清 ...

  8. git merge整理

    ========================================================== git bash merge 一.开发分支(dev)上的代码达到上线的标准后,要合 ...

  9. Python元类实战,通过元类实现数据库ORM框架

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是Python专题的第19篇文章,我们一起来用元类实现一个简易的ORM数据库框架. 本文主要是受到了廖雪峰老师Python3入门教程的启 ...

  10. 入门大数据---Sqoop基本使用

    一.Sqoop 基本命令 1. 查看所有命令 # sqoop help 2. 查看某条命令的具体使用方法 # sqoop help 命令名 二.Sqoop 与 MySQL 1. 查询MySQL所有数据 ...