如果您想了解在Python中,如何在类方法中访问“静态”类变量的相关知识,那么本文是一篇不可错过的文章,我们将对python静态方法访问类属性进行全面详尽的解释,并且为您提供关于python–所有类方
如果您想了解在Python中,如何在类方法中访问“静态”类变量的相关知识,那么本文是一篇不可错过的文章,我们将对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.bar
或Foo.bar
。分配给Foo.bar
将创建一个静态变量,分配给self.bar
将创建一个实例变量。
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 面向对象 (实例方法中访问实例变量与类变量)
一.在实例方法中访问实例变量与类变量
- 实例变量和对象也就是和类所生成的实例相关联的一个变量,实例方法也是和对象实例相关联的,那也就是实例可以调用的方法,叫作实例方法.实例方法最大的特点就是第一个参数是需要传入一个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中的实例方法、静态方法、类方法、类变量
注:使用的是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中的实例方法、静态方法、类方法、类变量和实例变量浅析
注:使用的是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(类对象,
[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
不过这两种方法是有区别的。