在类体中可以包含类的成员,
其中包含成员变量,成员方法和属性
成员变量又分为实例变量和类变量
成员方法又分为实例方法、类方法和静态方法
- 成员变量(attribute) :实例变量、类变量
类成员 - 属性(property)
- 成员方法 : 实例方法、类方法、静态方法
是类中保存数据的变量,如果需要对attribute进行封装,那么在类的外部为了访问这写attribute,往往会提供一些setter和getter访问器。
setter访问器是对attribute进行复制的方法
getter访问器是取attribute值的方法
这些方法在创建和调用时比较麻烦,于是python又提供了property.
property本质上就是setter和getter访问器,是一种方法。
就是某个实例(对象)个体特征有的“数据”,例如你家狗的名字,年龄
python中定义实例变量的代码:
class Animal(object):
"""定义动物类"""
def __init__(self, age, sex, weight): # 构造方法
self.age = age # 定义实例变量
self.sex = sex
self.weight = weight
animal = Animal(2, 1, 10.0)
print('年龄:{0}'.format(animal.age))
构造方法是用来创建和初始化实例变量,构造方法中的self 指当前对象实例的引用
创建和初始化实例变量age,其中self.age 表示对象的age实例变量
类变量是所有实例或对象共有的变量。
例如一个 Account 类(银行账号),成员变量有,金额,利率和账户名,那么金额和账户名是会变化的,但是所有的账户的利率是相同的。amount和owner成员变量与账户个体实例有关,称为实例变量,利率 rate 成员变量和个体实例无关,或者说是所有账户实例共享,称为类变量
class Account(object):
"""定义银行账户类"""
rate = 0.045 # 类变量
def __init__(self, owner, amount):
self.owner = owner # 定义实例变量
self.amount = amount
account = Account('deer', 500000)
print('用户:{0}'.format(account.owner))
print('利率:{0}'.format(Account.rate))
类变量访问:类名.类变量
实例变量访问:实例名.实例变量
事实上是有别于包和模块的另外一种形式的命名空间。
不要通过实例存取类变量的数据,会先到实例中找这个变量,然后再到类中,为它赋值时,不管类中是否有该同名变量,都会创建一个同名实例变量。
class Account(object):
"""定义银行账户类"""
rate = 0.045
def __init__(self, owner, amount):
self.owner = owner # 定义实例变量
self.amount = amount
account = Account('deer', 500000)
print('利率:{0}'.format(Account.rate))
print('acl利率:{0}'.format(account.rate))
print('实例所有变量:{0}'.format(account.__dict__))
account.rate = 1.0
account.rate1 = 2.0
print('实例所有变量:{0}'.format(account.__dict__))
print('利率:{0}'.format(Account.rate))
上面代码通过实例读取 rate 变量,解释器发现acoount实例中没有该变量,然后在Account类中找,如果类中也没有,会发生AtrributeError错误,虽然实例读取变量可以实现,但是不符合设计规范。
可以为acoount.rate进行赋值,这样的操作下无论类中是否有同名类变量都会创建一个新的实例变量,可以通过object提供的 __dict__
变量查看