类属性和实例属性
- 类属性:在Python中我们可以通过类名直接访问的属性,可分为公有类属性和私有类属性(类似于Java中的静态成员变量),公有属性可直接访问,而私有属性则要通过自定义的get和set方法来访问(对象来调用get与set方法)。
- 实例属性:实例对象(通过类创建的对象)拥有的属性,通过类名无法直接访问。对象可以在外部给直接添加属性(不建议使用,因为对象属性应该封装在类的内部,否则容易产生一些隐式错误),这个属性也叫实例属性。通常来讲,实例属性都在初始化方法
__init()
内部定义并且由传入的参数赋值(类似Java中的构造方法)。 - 需要注意的是,对象访问类属性不会对原类属性造成影响,因为当实例化对象后,内存中会给这个对象分配一片空间,因此这个对象访问的类属性是自己这片空间的类属性(相当于副本),所以通过对象直接来改变类属性是无法对原类属性产生影响的。
class people:
name = "tom" # 类属性
__height = 180
def __init__(self, age):
self.age = age # 实例属性
def getHeight(self):
return self.__height
def setHeight(self,height):
self.__height = height
print("通过类名访问:" + people.name)
p = people(20)
p.name="max"
p.setHeight(190)
print("通过对象访问:%s %d %d"%(p.name,p.age,p.getHeight()))
print("通过类名访问:" + people.name) #p.name="max"并没有影响到原类属性
结果:
类方法,实例方法和静态方法
- 类方法:类对象所拥有的方法,需要用修饰器
@classmethod
来标识,第一个参数必须是类对象,一般以cls
作为第一个参数(当然你也可以不叫cls
,这只是一种习惯与规范),能够通过实例对象和对象(类名)去访问。类方法可以让实例对象去修改类属性的值(上面已经讲过,实例对象无法直接修改类属性的值)
class people:
name = "tom" # 类属性
def __init__(self, age):
self.age = age # 实例属性
@classmethod
def setName(cls,name):
cls.name=name
p=people(20)
p.setName("max")
print(people.name)
结果:
- 实例方法:实例对象所拥有的方法,类对象无法访问(不能直接通过类名调用)。第一个参数必须是实例对象,一般以
self
作为第一个参数(同理,你也可以不叫self
,这只是一种习惯与规范),通过实例对象去调用。
class people:
name = "tom" # 类属性
def __init__(self, age):
self.age = age # 实例属性
def showAge(self):
print("年龄:%d"%(self.age))
p=people(20)
p.showAge()
结果:
- 静态方法:需要通过修饰器
@staticmethod
,不需要定义参数,可以当做普通函数使用。
class people:
name = "tom" # 类属性
def __init__(self, age):
self.age = age # 实例属性
@staticmethod
def showAge():
print("姓名:"+people.name)
people.showAge()
p=people(20)
p.showAge()
结果: