Python面向对象05 /私有成员、类方法、静态方法、属性、isinstance/issubclass

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. 对于私有类成员来说:当你遇到重要的数据/功能,(只允许本类使用的一些方法,数据)设置成私有成员

    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) #1
    print(obj1.b) #2
    print(obj2.b) #5
    print(obj2.c) #报错

Python面向对象05 /私有成员、类方法、静态方法、属性、isinstance/issubclass的更多相关文章

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

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

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

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

  3. python面向对象学习(六)类属性、类方法、静态方法

    目录 1. 类的结构 1.1 术语 -- 实例 1.2 类是一个特殊的对象 2. 类属性和实例属性 2.1 概念和使用 2.2 属性的获取机制 3. 类方法和静态方法 3.1 类方法 3.2 静态方法 ...

  4. python面向对象(类的成员及类方法)

    类的普通成员 字段 方法 属性 类的高级成员 静态字段 静态方法 属性方法   类方法 类成员修饰符 类的成员 类的成员可以分为三大类:字段.方法和属性 注:所有成员中,只有普通字段的内容保存对象中, ...

  5. Python面向对象之私有属性和私有方法

    01. 应用场景及定义方式 应用场景 在实际开发中,对象 的 某些属性或方法 可能只希望 在对象的内部被使用,而 不希望在外部被访问到 私有属性 就是 对象 不希望公开的 属性 私有方法 就是 对象  ...

  6. Python - 面向对象(二)类方法、静态方法

    面向对象的各种方法 静态方法 - @staticmethod class Person(): name = "cool guy" @staticmethod def static( ...

  7. python 面向对象和类成员和异常处理

    python 面向对象 你把自己想象成一个上帝,你要创造一个星球,首先你要把它揉成一个个球,两个直径就能创造一个球 class star: '''名字(name),赤道直径(equatorial di ...

  8. python面向对象与结构成员之间的关系

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

  9. python面向对象(二)——类成员

    Python面向对象    类成员 1.字段         普通字段    属于对象         静态字段    属于类   2.方法 普通方法   触发者是对象    括号里至少一个参数 se ...

随机推荐

  1. WPF中DataTemplateSelector的简单应用

    WPF中DataTemplateSelector的简单应用 DataTemplateSelector中文叫数据模板选择器,根据数据模型内的属性值选择不同的数据模板,多用于容器如listbox中,达到同 ...

  2. 动作函数-web_submit_data

    web_submit_data("login.pl", "Action=http://127.0.0.1:1080/WebTours/login.pl", &q ...

  3. BT.656视频信号解码

    BT.656视频信号解码   BT.656协议标准 ITU-R BT.601和ITU-R BT.656是ITU-R(国际电信联盟)制定的标准.严格来说ITU-R BT.656是ITU-R BT.601 ...

  4. JavaSE的基本语法

    JavaSE基本语法 一.语法的注意事项 1.严格区分大小写 2.每句命令结尾使用分号 3.符号都是英文状态 4.括号.引号都是成对出现的! 5.注意缩进 Tips: 文件名和类名可以不一致,但pub ...

  5. MFC的Spin Control基础控件的使用

    1.向GUI界面添加一个MFC 提供的Spin数值调节控件 2.设置其"伙伴“,并设置数值调节的范围 3.如何让数值显示在文本框中?你可以有多种选择:可以让文本框控件绑定一个数值类型的变量: ...

  6. 关于margin外边距合并的问题

    一 .兄弟元素margin外边距合并演示   当两个垂直方向相邻的兄弟元素都为常规流块盒,他们之间垂直方向的外边距不是两者之和,而是取两者中的最大值.这种现象被称为相邻的兄弟元素垂直方向外边距合并. ...

  7. 用 npm 搭建vue项目

    一.开发环境 vue推荐开发环境: Node.js: javascript运行环境(runtime),不同系统直接运行各种编程语言 npm: Nodejs下的包管理器. webpack: 它主要的用途 ...

  8. Flutter学习笔记(37)--动画曲线Curves 效果

    如需转载,请注明出处:Flutter学习笔记(37)--动画曲线Curves 效果

  9. 【WebLogic使用】3.WebLogic配置jndi数据源

    参见博客:https://blog.csdn.net/acmman/article/details/70146603 参考视频教程: 一.什么是jndi数据源JNDI是Java命名与目录接口(Java ...

  10. 传统声学模型之HMM和GMM

    声学模型是指给定声学符号(音素)的情况下对音频特征建立的模型. 数学表达 用 \(X\) 表示音频特征向量 (观察向量),用 \(S\) 表示音素 (隐藏/内部状态),声学模型表示为 \(P(X|S) ...