zoukankan      html  css  js  c++  java
  • python 类属性与方法

    Python 类属性与方法

    标签(空格分隔): Python


    Python的访问限制

    Python支持面向对象,其对属性的权限控制通过属性名来实现,如果一个属性有双下划线开头(__),该属性就无法被外部访问。

    class Person:
    	def __init__(self, name, age, sex):
    		self.name = name
    		self._age = age
    		self.__sex = sex
    
    	def out_name(self):
    		print self.name
    
    	def _out_age(self):
    		print self._age
    	
    	def __out_sex(self):
    		print self.__sex
    		
    xiaohong = Person('xiaohong', 20, 1)
    print 'name'
    xiaohong.out_name()
    print xiaohong.name
    print 'age'
    xiaohong._out_age()
    print xiaohong._age
    print 'sex'
    # 以下两句报错
    xiaohong.__out_sex() # AttributeError: Person instance has no attribute '__outSex'
    xiaohong.__sex # AttributeError: Person instance has no attribute '__sex'
    

    可以看到,以双下划线开头的变量无法在类外被访问。

    当然以单下划线开头的变量能够被外界访问,然而在一般规范中,将正常变量作为类变量,将单下划线开头的变量作为实例变量。

    类变量与实例变量

    类变量就是在类的实例之间能够共享变量值的变量,实例变量就是该实例具有的变量。也就说,实例变量每个实例各自拥有,互相独立,而类变量有且只有一份。
    具体可以参见:

    # coding=utf-8
    class aa:
          # w就是一个类变量,为该类的实例对象所共有,需要在定义时就进行赋值
          w = 10
          def __init__(self):
               self._x = 11
               self._y = 12
          def add(self):
               return self._x + self._y
    
    a = aa()
    print a.add()
    # 改变类变量的值
    aa.w = 20
    # 设置实例中实例变量的值,将覆盖类变量的值
    a.w = 13
    print aa.w, a.w                          # 输出20 13
    del a.w
    print a.w                                # 输出20
    
    # 设置实例变量
    a._t = 14
    a._q = 15
    print a._t, a._q                           # 输出14 15
    
    # 设置类变量,该类的所有实例对象共有
    aa.m = 30
    aa.n = 40
    print aa.m, aa.n                         # 输出30 40
    
    
    b = aa()
    print b._x,b._y
    # print b._t,b._q                          # 该句报错,因为b对象没有属性t,q
    print b.m,b.n                            # 25.26行设置了类变量m,n,输出30 40
    print b.w                                # 在14行已经改变了w的值,输出20
    

    实例方法与类方法

    和属性变量一样,方法也分为实例方法与类方法。
    class内部定义的全部是实例方法,实例方法的第一个参数是self代表的是实例本身。
    要在class中定义类方法,需要使用@classmethod修饰说明,参数也不在是self,而是cls.

    class Person:
    
        __count = 0
        
        def __init__(self, name):
            self._name = name
            Person.__count += 1
    
        @classmethod
        def how_many(cls):
            return cls.__count
    
    print Person.how_many()                         # 输出 0
    
    p1 = Person('Bob')
    
    print Person.how_many()                         # 输出1
    
  • 相关阅读:
    POJ3294Life Forms(广义后缀自动机)(后缀数组+二分+数状数组)
    URAL1517Freedom of Choice(后缀数组)
    POJ2406Power Strings (最小循环节)(KMP||后缀数组)
    POJ2774Long Long Message (后缀数组&后缀自动机)
    SPOJ705 Distinct Substrings (后缀自动机&后缀数组)
    Nacos: Namespace 和 Endpoint 在生产环境下的最佳实践
    阿里PB级Kubernetes日志平台建设实践
    深度解读Helm 3: 犹抱琵琶半遮面
    开发者说:如何参与定义一款 IDE 插件
    从开源小白到 Apache Member,我的成长之路
  • 原文地址:https://www.cnblogs.com/tingyugetc/p/5793598.html
Copyright © 2011-2022 走看看