类的属性和方法

类的属性和方法

在类的内部可以定义属性和方法,而在类的外部则可以直接调用属性或方法来操作数据,从而隐藏了类内部的复杂逻辑。但是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. 无法通过类名访问私有的方法
posted @ 2020-06-23 15:06  搬砖工周某  阅读(541)  评论(0编辑  收藏  举报