目录
?、类的成员介绍:
?先, 什么是类的成员. 很简单. 我么能在类中写什么? 写的内容就是成员. 到?前为?. 我们
已经学过了?些成员了.
class Foo:
def __init__(self, a, b):
self.a = a # 这里的self.a和self.b都是成员
self.b = b
def method(self): # 方法也是类的成员
pass
- 在上?代码中__init__和method都属于类的成员?法,?称为实例?法。总之这样的东?
需要?对象来访问。- 上?的
self.a = a
这个代码的含义是给对象设置属性信息,含义是这个对象的xxx属性是xxxx. 这种东??被称之为成员变量或者实例变量, 再或者被称之为字段。
二、类的成员-变量
在类中变量分成两?类:
- 实例变量(字段)
- 类变量(静态变量)
1. 实例变量
其实之前写的都是实例变量,所谓实例变量就是实例(也就是对象)的变量,实例也是就是指self
,也是就是说,前面写的self.xxx
都是实例变量:
class Foo:
def __init__(self, name, age):
self.name = name
self.age = age
f1 = Foo('Jerry', 18)
f2 = Foo('James', 29)
print(f1.name, f1.age) # 每个对象都拥有自己的实例变量
print(f2.name, f2.age) # 实例变量都必须要通过实例来调用
# 结果:
# Jerry 18
# James 29
2. 类变量
类变量是一个类所拥有的,每个实例也可以直接访问类变量。类变量就可以看作是一个类公有的一种变量,如果对象自己没有设置这个值,那么默认就用统一的类变量。
class Person:
country = '中国' # 类变量
def __init__(self, name, age): # 实例变量中并没有设置country属性
self.name = name
self.age = age
Person.country = '大清'
print(Person.country) # 打印结果是:大清
p1 = Person('zzc', 26)
print(p1.country) # 打印结果也是大清
从上面的例子可以看出如果对象中没有country属性,那么会使用类变量country,下面再看一个例子:
class Person:
country = '中国'
def __init__(self, name, age):
self.name = name
self.age = age
Person.country = '大清' # 类变量修改后变成了‘大清’
p1 = Person('zzc', 26)
print(p1.country) # 打印结果是:大清
p2 = Person('milkgood', 27)
print(p2.country) # 打印结果也是大清
上面的例子说明,变量p1
和p2
使用的都是同一个变量country
,在手动把类变量的值修改过后,变量p1
和p2
所对应的country
也跟着改变了,所以他们是指向的同一块物理地址。下面我们把上面的程序改一下,来看?个和类变量息息相关的坑:
class Person:
country = '中国'
def __init__(self, name, age):
self.name = name
self.age = age
# Person.country = '大清' # 这里先把修改类变量的语句注释了
print(Person.country) # 首次打印的是类变量最开始时候的值
p1 = Person('zzc', 26) # 然后实例化了一个对象p1
p1.country = '大清' # 然后修改了对象中的country的值为大清
print(p1.country) # 此时打印结果是:大清
p2 = Person('milkgood', 27) # 再次实例化了一个对象p2
print(p2.country) # 打印结果还是中国
# 输出结果:
# 中国
# 大清
# 中国
我们来看下面的图来分析:
好了. 来对类成员中的变量做个简单的总结:
- 实例变量:给对象?的.
- 类变量:多个对象共享的. 最好是?类名来访问. 这样更加规范
三、类的成员-方法
类中的方法分为三种:
- 成员?法(实例?法)
- 静态?法
- 类?法
1. 成员方法
成员方法也是之前写的最多的方法,可以说之前写的方法都是成员方法,也就是说对象直接访问的方法就是成员方法
class Car:
def run(self):
print('老司机永不翻车')
def jump(self): # 这中带self参数的都是实例方法,之前写的都是实方法
print('you jump i jump')
c = Car()
c.run()
c.jump()
# 输出结果:
# 老司机永不翻车
# you jump i jump
实例方法也能像实例变量一样赋值
def fly():
print('我是一辆会飞的车')
class Car:
def run(self):
print('老司机永不翻车')
def jump(self): # 这中带self参数的都是实例方法,之前写的都是实方法
print('you jump i jump')
c = Car()
c.fly = fly # 像实例变量一样把函数名赋值给实例的一个属性
c.fly() # 打印结果: 我是一辆会飞的车
2. 类方法
跟类变量一样,是属于类的命名空间的,可以直接通过类名来访问(需要传入一个参数cls),但是要注意,类方法需要在函数上加上一个名为classmethod的装饰器
class Person:
def eat(self):
print('i\'m eating')
@classmethod # 加上classmethod装饰器
def drink(cls): # 这个cls参数在使用类调用时,python解释器会自动传入
print(cls)
print('i\'m drinking')
print(Person)
Person.drink() # 使用类名直接访问
p = Person()
p.drink() # 也可以实例化对象后,通过对象访问,但是不建议这么做
# 打印结果:
# <class '__main__.Person'>
# <class '__main__.Person'>
# i'm drinking
# <class '__main__.Person'>
# i'm drinking
3. 静态方法
静态方法也跟类方法一样,跟对象无关,直接使用类直接访问且无需参数,但是要加上staticmethod装饰器
class Foo:
def __init__(self, user):
self.user = user
@staticmethod # 加上staticmethod装饰器
def staticMthod(): # 这里不用传入参数
print('这是一个静态方法')
Foo.staticMthod() # 直接使用类访问
f = Foo('s')
f.staticMthod() # 也可以通过对象访问,不过不建议
# 输出结果
# 这是一个静态方