GVKun编程网logo

在Python中,如何在类方法中访问“静态”类变量(python 静态方法访问类属性)

14

如果您想了解在Python中,如何在类方法中访问“静态”类变量的相关知识,那么本文是一篇不可错过的文章,我们将对python静态方法访问类属性进行全面详尽的解释,并且为您提供关于python–所有类方

如果您想了解在Python中,如何在类方法中访问“静态”类变量的相关知识,那么本文是一篇不可错过的文章,我们将对python 静态方法访问类属性进行全面详尽的解释,并且为您提供关于python – 所有类方法中的类变量访问、python 面向对象 (实例方法中访问实例变量与类变量)、python中的实例方法、静态方法、类方法、类变量、python中的实例方法、静态方法、类方法、类变量和实例变量浅析的有价值的信息。

本文目录一览:

在Python中,如何在类方法中访问“静态”类变量(python 静态方法访问类属性)

在Python中,如何在类方法中访问“静态”类变量(python 静态方法访问类属性)

如果我有以下python代码:

class Foo(object):    bar = 1    def bah(self):        print(bar)f = Foo()f.bah()

它抱怨

NameError: global name ''bar'' is not defined

如何bar在方法中访问类/静态变量bah

答案1

小编典典

代替bar使用self.barFoo.bar。分配给Foo.bar将创建一个静态变量,分配给self.bar将创建一个实例变量。

python – 所有类方法中的类变量访问

python – 所有类方法中的类变量访问

我想要一个类变量,以便可以在所有实例中访问该值,但我还想在类中的方法中访问该变量.那可能吗?我试过这个,但它根本不起作用.

class myClass:
   myvariable = 1

   def add():
      myvariable+= 1

   def print1():
      print myvariable

我想制作两个实例,一个只做add方法,另一个只做print1方法

解决方法

是的,只需访问类对象上的变量:

class myClass(object):
    myvariable = 1

    def add(self):
        myClass.myvariable += 1

    def print1(self):
        print myClass.myvariable

或者如果要为每个子类设置它,请使用type(self):

class myClass(object):
    myvariable = 1

    def add(self):
        type(self).myvariable += 1

    def print1(self):
        print type(self).myvariable

不同之处在于后者将在设置时在任何子类上创建单独的属性,从而屏蔽基类属性.这就像在实例上设置属性会掩盖class属性一样.

虽然你也可以通过self获取class属性(print self.myvariable),但显式优于隐式,并且避免意外被同名的实例属性屏蔽.设置类属性总是必须在类上完成;将其设置为self将改为创建或更新实例属性(不共享).

尽管从对象继承你的类;使用新式类有很多优点,至少那个类型(self)实际上会返回类.在旧式类(不是从对象继承)中,你必须使用self .__ class__.

使用对象作为基础也为您提供了第三个选项,类方法与@classmethod decorator;当您只需要访问类对象而不是实例时,请使用这些.这些方法绑定到当前(子)类,因此它们对类属性的影响与使用类型(self)相同:

class myClass(object):
    myvariable = 1

    @classmethod
    def add(cls):
        cls.myvariable += 1

    @classmethod
    def print1(cls):
        print cls.myvariable

python 面向对象 (实例方法中访问实例变量与类变量)

python 面向对象 (实例方法中访问实例变量与类变量)

一.在实例方法中访问实例变量与类变量

  • 实例变量和对象也就是和类所生成的实例相关联的一个变量,实例方法也是和对象实例相关联的,那也就是实例可以调用的方法,叫作实例方法.实例方法最大的特点就是第一个参数是需要传入一个self
  • python 变量和方法是什么关系呢?方法需要对变量做一系列的运算或者是逻辑上的一些操作,最终去改变变量的状态,这就是方法最本质的意义.
  • 当然方法也可以不操作任何的变量,但这是少数的,绝大多数是改变变量的特征的.既然方法要操作变量,那么就涉及到方法何如访问变量的问题.
  • 实例方法操作实例变量,看似是理所当然的,因为它们都是和对象相关联. 在实例方法中通过self. 给实例变量赋值,通过这样的一个方式来读取变量.


Step 1.实例方法可以访问类变量吗? 如果可以访问的话,那么访问方法是什么?

  • 操作实例变量是很容易的,假如我们需要print一个实例变量:print(self.name),这样就可以操作实例变量.
  • 构造函数可以看作是特殊的实例方法,构造函数是比较特殊,但它几乎所有行为和普通的实例方法其实是一样的.
  • 区别构造函数和普通实例方法:
    1.它们调用的方法方式是不一样的; 调用构造函数实际上是通过类后面的括号的方式来调用;普通实例方法调用的方式是通过student1.do_homework()来调用
    2.第二点不同是它们的意义不同. 实例方法的主要作用是描述类的行为; 而构造函数的意义在于初始化类的各种特征.
  • 在构造函数 很多人认为print(self.name) 和print(name) 是等价的,等价的原因在于print(self.name) 和 print(name)打印的结果是一样的. 
$ vim s4.py

class Student():
    
    sum = 0 

    def __init__(self, name, age):
        self.name = name
        self.age = age
        print(self.name)
        print(name)

    
    def do_homework(self):
        print(''homework'')


student1 = Student(''小明'', 18) 


#执行结果
$ python s4.py 
小明
小明

 

#形参name改为name1,print(self.name)可以打印,而print(name)则会报错,因为name形参name不存在.

class Student():
    
    sum = 0 

    def __init__(self, name1, age):
        self.name = name1
        self.age = age
        print(self.name)
        print(name)

    
    def do_homework(self):
        print(''homework'')


student1 = Student(''小明'', 18) 




$ python s4.py 

小明
Traceback (most recent call last):
  File "s4.py", line 17, in <module>
    student1 = Student(''小明'', 18) 
  File "s4.py", line 10, in __init__
    print(name)
NameError: global name ''name'' is not defined


Step 2.在构造函数内部访问类变量

1.例子1

$ vim s4.py

class Student():
    
    sum = 0 

    def __init__(self, name, age):
        self.name = name
        self.age = age
        #print(self.name)
        print(sum)
    
    def do_homework(self):
        print(''homework'')


student1 = Student(''小明'', 18) 
print(student1.name)


#打印结果
说明:打印结果是没有报错的,刚好sum 是python 自带的变量
$ python s4.py 

<built-in function sum> 
小明


2.例子2
说明:sum更改为sum1

class Student():
    
    sum1 = 0 

    def __init__(self, name, age):
        self.name = name
        self.age = age
        #print(self.name)
        print(sum1)
    
    def do_homework(self):
        print(''homework'')


student1 = Student(''小明'', 18) 
print(student1.name)


#执行结果
说明:还是提示sum1找不到

$ python s4.py 

Traceback (most recent call last):
  File "s4.py", line 16, in <module>
    student1 = Student(''小明'', 18) 
  File "s4.py", line 10, in __init__
    print(sum1)
NameError: global name ''sum1'' is not defined


3.构造函数正确访问类变量应该是:print(Student.sum1)

$ vim s4.py

class Student():
    
    sum1 = 0 

    def __init__(self, name, age):
        self.name = name
        self.age = age
        #print(self.name)
        print(Student.sum1)
    
    def do_homework(self):
        print(''homework'')


student1 = Student(''小明'', 18) 
print(student1.name)


#执行结果(成功读取到了类变量sum1)

python s4.py 
0
小明


4.通过self.__class__ (__class__是self内置的变量)来访问类变量

$ vim s4.py

class Student():
    
    sum1 = 0 

    def __init__(self, name, age):
        self.name = name
        self.age = age
        #print(self.name)
        print(self.__class__.sum1)
    
    def do_homework(self):
        print(''homework'')


student1 = Student(''小明'', 18) 
print(student1.name)


#执行结果

$ python s4.py 
0
小明



5.外部读取类变量方式:print(Student.sum1)

$ vim s4.py

class Student():
    
    sum1 = 0 

    def __init__(self, name, age):
        self.name = name
        self.age = age
        #print(self.name)
        #print(Student.sum1)
    
    def do_homework(self):
        print(''homework'')


student1 = Student(''小明'', 18) 
print(student1.name)
print(Student.sum1)


#执行结果其实是一样的

$ python s4.py 
0
小明

 

python中的实例方法、静态方法、类方法、类变量

python中的实例方法、静态方法、类方法、类变量

注:使用的是Python2.7。

一、实例方法

实例方法就是类的实例能够使用的方法。如下:
代码如下:
class Foo:
def __init__(self, name):
self.name = name
def hi(self):
print self.name

if __name__ == ‘__main__’:
foo01 = Foo(‘letian’)
foo01.hi()
print type(Foo)
print type(foo01)
print id(foo01)
print id(Foo)
运行结果为:
代码如下:
letian
type ‘classobj’
type ‘instance’
40124704
31323448[code]
可以看到,Foo的type为classobj(类对象,python中定义的类本身也是对象),foo01的type为instance(实例)。而hi()是实例方法,所以foo01.hi()会输出’letian’。实例方法的第一个参数默认为self,代指实例。self不是一个关键字,而是约定的写法。init()是生成实例时默认调用的实例方法。将Foo的定义改为以下形式:
[code]class Foo:
def __init__(this, name):
this.name = name
def hi(here):
print here.name
运行依然正确。 内置函数id用来查看对象的标识符,下面是其doc内容:
代码如下:
print id.__doc__
id(object) – integer

Return the identity of an object. This is guaranteed to be unique among
simultaneously existing objects. (Hint: it’s the object’s memory address.)

二、静态方法

静态方法是一种普通函数,就位于类定义的命名空间中,它不会对任何实例类型进行操作。使用装饰器@staticmethod定义静态方法。类对象和实例都可以调用静态方法:
代码如下:
class Foo:
def __init__(self, name):
self.name = name
def hi(self):
print self.name
@staticmethod
def add(a, b):
print a + b

if __name__ == ‘__main__’:
foo01 = Foo(‘letian’)
foo01.hi()
foo01.add(1,2)
Foo.add(1, 2)


运行结果如下:
代码如下:
letian
3
3
注意,很多编程语言不允许实例调用静态方法。

三、类方法

类方法是将类本身作为对象进行操作的方法。类方法使用@classmethod装饰器定义,其第一个参数是类,约定写为cls。类对象和实例都可以调用类方法:
代码如下:
class Foo:
name = ‘letian ‘
@classmethod
def hi(cls, x):
print cls.name * x

if __name__ == ‘__main__’:
foo01 = Foo()
foo01.hi(2)
Foo.hi(3)
运行结果如下:
代码如下:
letian letian
letian letian letian
注意,很多其他的编程语言不允许实例调用类方法。

四、super

super用来执行父类中的函数,例如:
代码如下:
class Foo(object):
def hi(self):
print ‘hi,Foo’

class Foo2(Foo):
def hi(self):
super(Foo2, self).hi()

if __name__ == ‘__main__’:
foo2 = Foo2()
foo2.hi()
运行结果:
代码如下:
hi,Foo
注意,Foo类必须继承某个类(并且这个继承链开始于object类),否则会报错。如果改成下面的形式:
代码如下:
class Foo:
def hi(self):
print ‘hi,Foo’

class Foo2(Foo):
def hi(self):
super(Foo2, self).hi()

if __name__ == ‘__main__’:
foo2 = Foo2()
foo2.hi()
运行时报错如下:
代码如下:
……
TypeError: must be type, not classobj
关于super,具体请见http://docs.python.org/2/library/functions.html?highlight=super#super以及super.doc。


五、类变量和实例变量

类变量定义在类的定义之后,实例变量则是以为self.开头。例如:
代码如下:
class Foo(object):
val = 0
def __init__(self):
self.val = 1

if __name__ == ‘__main__’:
foo = Foo()
print foo.val
print Foo.val
运行结果为:
代码如下:
1
0
实例也能够访问类变量,如下:
代码如下:
class Foo(object):
val = 0
def __init__(self):
pass
if __name__ == ‘__main__’:
foo = Foo()
print foo.val
print Foo.val
运行结果如下:
代码如下:
0
0
另外,可以通过以下方式访问类变量:
代码如下:
class Foo(object):
val = 3
def __init__(self):
print self.__class__.val
if __name__ == ‘__main__’:
foo = Foo()
运行结果:
代码如下:
3
还可以这样:
代码如下:
class Foo(object):
val = 3
def __init__(self):
pass
@classmethod
def echo(cls):
print cls.val
if __name__ == ‘__main__’:
Foo.echo()
运行结果:
代码如下:
3

六、如何调用父类的构造函数

子类(派生类)并不会自动调用父类(基类)的init方法,例如:
代码如下:
class Foo(object):
def __init__(self):
self.val = 1

class Foo2(Foo):
def __init__(self):
print self.val

if __name__ == ‘__main__’:
foo2 = Foo2()
运行时报错。

调用父类的init方法有两种,第一种:
代码如下:
class Foo(object):
def __init__(self):
self.val = 1

class Foo2(Foo):
def __init__(self):
Foo.__init__(self)
print self.val

if __name__ == ‘__main__’:
foo2 = Foo2()
第二种:
代码如下:
class Foo(object):
def __init__(self):
self.val = 1

class Foo2(Foo):
def __init__(self):
super(Foo2,self).__init__()
print self.val

if __name__ == ‘__main__’:
foo2 = Foo2()
这两种方法的运行结果均为:
代码如下:
1
不过这两种方法是有区别的。


python中的实例方法、静态方法、类方法、类变量和实例变量浅析

python中的实例方法、静态方法、类方法、类变量和实例变量浅析

注:使用的是Python2.7。

一、实例方法

实例方法就是类的实例能够使用的方法。如下:

复制代码 代码如下:
class Foo:
    def __init__(self, name):
        self.name = name
    def hi(self):
        print self.name

if __name__ == ''__main__'':
    foo01 = Foo(''letian'')
    foo01.hi()
    print type(Foo)
    print type(foo01)
    print id(foo01)
    print id(Foo)


运行结果为:
复制代码 代码如下:
letian


40124704
31323448[code]
可以看到,Foo的type为classobj(类对象,python中定义的类本身也是对象),foo01的type为instance(实例)。而hi()是实例方法,所以foo01.hi()会输出''letian''。实例方法的第一个参数默认为self,代指实例。self不是一个关键字,而是约定的写法。init()是生成实例时默认调用的实例方法。将Foo的定义改为以下形式:
[code]class Foo:
    def __init__(this, name):
        this.name = name
    def hi(here):
        print here.name
运行依然正确。 内置函数id用来查看对象的标识符,下面是其doc内容:
复制代码 代码如下:
>>> print id.__doc__
id(object) -> integer

Return the identity of an object.  This is guaranteed to be unique among
simultaneously existing objects.  (Hint: it''s the object''s memory address.)

二、静态方法

静态方法是一种普通函数,就位于类定义的命名空间中,它不会对任何实例类型进行操作。使用装饰器@staticmethod定义静态方法。类对象和实例都可以调用静态方法:

复制代码 代码如下:
class Foo:
    def __init__(self, name):
        self.name = name
    def hi(self):
        print self.name
    @staticmethod
    def add(a, b):
        print a + b

if __name__ == ''__main__'':
    foo01 = Foo(''letian'')
    foo01.hi()
    foo01.add(1,2)
    Foo.add(1, 2)


    运行结果如下:

复制代码 代码如下:
letian
3
3
注意,很多编程语言不允许实例调用静态方法。

三、类方法

类方法是将类本身作为对象进行操作的方法。类方法使用@classmethod装饰器定义,其第一个参数是类,约定写为cls。类对象和实例都可以调用类方法:

复制代码 代码如下:
class Foo:
    name = ''letian ''
    @classmethod
    def hi(cls, x):
        print cls.name * x

if __name__ == ''__main__'':
    foo01 = Foo()
    foo01.hi(2)
    Foo.hi(3)


运行结果如下:
复制代码 代码如下:
letian letian
letian letian letian
注意,很多其他的编程语言不允许实例调用类方法。

四、super

super用来执行父类中的函数,例如:

复制代码 代码如下:
class Foo(object):
    def hi(self):
        print ''hi,Foo''

class Foo2(Foo):
    def hi(self):
        super(Foo2, self).hi()

if __name__ == ''__main__'':
    foo2 = Foo2()
    foo2.hi()


运行结果:
复制代码 代码如下:
hi,Foo
注意,Foo类必须继承某个类(并且这个继承链开始于object类),否则会报错。如果改成下面的形式:
复制代码 代码如下:
class Foo:
    def hi(self):
        print ''hi,Foo''

class Foo2(Foo):
    def hi(self):
        super(Foo2, self).hi()

if __name__ == ''__main__'':
    foo2 = Foo2()
    foo2.hi()


运行时报错如下:
复制代码 代码如下:
......
TypeError: must be type, not classobj
关于super,具体请见http://docs.python.org/2/library/functions.html?highlight=super#super以及super.doc。


五、类变量和实例变量

类变量定义在类的定义之后,实例变量则是以为self.开头。例如:

复制代码 代码如下:
class Foo(object):
    val = 0
    def __init__(self):
        self.val = 1

if __name__ == ''__main__'':
    foo = Foo()
    print foo.val
    print Foo.val


运行结果为:
复制代码 代码如下:
1
0
实例也能够访问类变量,如下:
复制代码 代码如下:
class Foo(object):
    val = 0
    def __init__(self):
        pass
if __name__ == ''__main__'':
    foo = Foo()
    print foo.val
    print Foo.val
运行结果如下:
复制代码 代码如下:
0
0
另外,可以通过以下方式访问类变量:
复制代码 代码如下:
class Foo(object):
    val = 3
    def __init__(self):
        print self.__class__.val
if __name__ == ''__main__'':
    foo = Foo()
运行结果:
复制代码 代码如下:
3
还可以这样:
复制代码 代码如下:
class Foo(object):
    val = 3
    def __init__(self):
        pass
    @classmethod
    def echo(cls):
        print cls.val
if __name__ == ''__main__'':
    Foo.echo()
运行结果:
复制代码 代码如下:
3

六、如何调用父类的构造函数

子类(派生类)并不会自动调用父类(基类)的init方法,例如:

复制代码 代码如下:
class Foo(object):
    def __init__(self):
        self.val = 1

class Foo2(Foo):
    def __init__(self):
        print self.val

if __name__ == ''__main__'':
    foo2 = Foo2()


运行时报错。

调用父类的init方法有两种,第一种:

复制代码 代码如下:
class Foo(object):
    def __init__(self):
        self.val = 1

class Foo2(Foo):
    def __init__(self):
        Foo.__init__(self)
        print self.val

if __name__ == ''__main__'':
    foo2 = Foo2()


第二种:
复制代码 代码如下:
class Foo(object):
    def __init__(self):
        self.val = 1

class Foo2(Foo):
    def __init__(self):
        super(Foo2,self).__init__()
        print self.val

if __name__ == ''__main__'':
    foo2 = Foo2()


这两种方法的运行结果均为:
复制代码 代码如下:
1
不过这两种方法是有区别的。

我们今天的关于在Python中,如何在类方法中访问“静态”类变量python 静态方法访问类属性的分享就到这里,谢谢您的阅读,如果想了解更多关于python – 所有类方法中的类变量访问、python 面向对象 (实例方法中访问实例变量与类变量)、python中的实例方法、静态方法、类方法、类变量、python中的实例方法、静态方法、类方法、类变量和实例变量浅析的相关信息,可以在本站进行搜索。

本文标签:

上一篇Java:为什么我不能在Comparator中抛出异常?(不能在finally抛出异常)

下一篇Nutch API建议