zoukankan      html  css  js  c++  java
  • 类的属性和方法

    类的属性和方法

    在类的内部可以定义属性和方法,而在类的外部则可以直接调用属性或方法来操作数据,从而隐藏了类内部的复杂逻辑。但是Python并没有对属性和方法的访问权限进行限制。为了保证类内部的某些属性和方法不被外部所访问,我们可以将属性或者方法名前面添加_或者__来限制访问权限

    单_作用:以单下划线开头的表示protected(保护)类型的成员,只允许类本身和子类进行访问,但不能使用from moudule import *语句进行导入

    双__线作用:首尾双下划线表示定义特殊的方法,一遍是系统定义的名字。如__init__()

    私有类属性和实例属性的区别及调用

    _定义

    • 类属性

      • 通过类名访问:类名._类属性
      • 通过对象访问:对象._类属性
    • 实例属性

      • 通过类名访问:无法通过类名访问,会报错没有这个属性
      • 通过对象访问:对象._实例属性

      __定义

    • 类属性

      • 通过类名访问:类名._类名__类属性
      • 通过对象访问:对象._类名__类属性
    • 实例属性

      • 通过类名访问:无法通过类名访问,会报错没有这个属性
      • 通过对象访问:对象名_类名__实例属性
    class Demo:
        # 创建私有类属性a,b,一个用_,一个用__
        _a = 10
        __b = 20
    
        def __init__(self, name, age):
            """
            创建实例属性name,age,一个用_一个用__
            :param name: _
            :param age: __
            """
            self._name = name
            self.__age = age
    
    
    if __name__ == '__main__':
        # 创建一个对象
        obj = Demo('xiaoming', 18)
        # 通过类名访问带 _ 的类属性
        print(Demo._a)
        # 无法通过类名访问带 _ 的实例属性
    
        # 通过对象访问带 _ 的类属性,对象名.类属性
        print(obj._a)
        # 通过对象访问带 _ 的类实例属性,对象名.实例属性
        print(obj._name)
    
        # 通过类名访问带 __ 的类属性
        print(Demo._Demo__b)
        # 无法通过类名访问带 __ 的实例属性
    
        # 通过对象访问带 __ 的类属性
        print(obj._Demo__b)
        # 通过对象访问带 __ 的实例属性
        print(obj._Demo__age)
    

    类的私有类方法和实例方法的区别及调用

    _定义

    • 类方法:
      • 通过类名访问:类名._方法名()
      • 通过对象访问:对象._方法名()
    • 实例方法:
      • 通过类名访问:无法通过类名访问,会报错没有这个属性
      • 通过对象访问:对象._方法名()

    __定义

    • 类方法:
      • 通过类名访问:类名._类名__类方法()
      • 通过对象访问:对象._类名__类方法()
    • 实例方法:
      • 通过类名访问:无法通过类名访问,会报错没有这个属性
      • 通过对象访问:对象._类名__方法名()
    class Demo:
        def _test1(self):
            """
            创建一个带_的实例方法test1
            :return:
            """
            print('打印一个带_实例方法test1')
    
        def __test2(self):
            """
            创建一个带__的实例方法test2
            :return:
            """
            print('打印两个带__实例方法test2')
    
        @classmethod
        def _test3(cls):
            """
            创建一个带_的类方法test3
            :return:
            """
            print('打印一个带_类方法test3')
    
        @classmethod
        def __test4(cls):
            """
            创建两个带__的类方法test4
            :return:
            """
            print('打印两个带__类方法test4')
    
    
    if __name__ == '__main__':
        # 创建一个对象
        obj = Demo()
        # 通过类名访问带 _ 的类方法,类名.方法名()
        Demo._test3()
        # 无法通过类名访问带 _ 的实例方法
    
        # 通过对象名访问带 _ 的类方法,对象名.类方法()
        obj._test3()
        # 通过对象名访问带 _ 的类实例方法,对象名.实例属性()
        obj._test1()
    
        # 通过类名访问带 __ 的类方法,类名._类名__方法名()
        Demo._Demo__test4()
        # 无法通过类名访问带 __ 的实例方法
    
        # 通过对象名访问带 __ 的类方法,对象._类名__类方法()
        obj._Demo__test4()
        # 通过对象名访问带 __ 的实例方法,对象._类名__实例方法()
        obj._Demo__test2()
    

    总结:

    Python类中,我们可以使用___来定义私有类属性和方法,也可以使用一定的方法来进行调用,对于两种特殊情况,是需要注意的:

    1. 无法通过类名访问私有的属性
    2. 无法通过类名访问私有的方法
  • 相关阅读:
    安装pip-9.0.1-py2.py3-none-any.whl
    Flask-Moment本地化日期和时间
    在windows下使用VirtualEnv建立flask项目
    java web中Jdbc访问数据库步骤通俗解释(吃饭),与MVC的通俗解释(做饭)
    java web中cookie的永久创建与撤销
    myeclipse与数据库进行连接(无需写代码进行验证)
    求二维数组最大子数组和
    Java代码实现 增删查 + 分页——实习第四天
    JDBC 数据库连接操作——实习第三天
    Java基础语法实例(2)——实习第二天
  • 原文地址:https://www.cnblogs.com/zhouxiongjie/p/13182148.html
Copyright © 2011-2022 走看看