课程名称:Python3 进阶教程(新版)
章节名称:第2章 Python面向对象编程
讲师名称:咚咚呛
课程内容
- 类属性和实例属性的优先级
- 类属性访问限制
- 定义实例方法
- 定义类方法
学习收获
类属性的优先级
属性可以分为类属性和实例属性。
在类属性和实例属性同时存在的情况下,实例属性的优先级是要高于类属性的,在操作实例的时候,优先是操作实例的属性。
实例没有和类同名的时候,通过实例对象,依然可以访问到类属性。
class Animal(object):
localtion = 'Asia'
def __init__(self, name, age, location):
self.name = name
self.age = age
self.location = location
cat = Animal('mimi', 3, 'GuangDong')
print(cat.localtion) # ==> GuangDong
print(Animal.location) # ==> Asia
通过实例是无法修改类的属性的,事实上,通过实例方法修改类属性,只是给实例绑定了一个对应的实例属性。尽量不要通过实例来修改类属性,否则很容易引发意想不到的错误。
类属性的访问限制
并不是所有的属性都可以被外部访问的,这种不能被外部访问的属性称为私有属性。私有属性是以双下划线__
开头的属性。
在外部访问私有属性将会抛出异常,提示没有这个属性。虽然私有属性无法从外部访问,但是,从类的内部是可以访问的。私有属性是为了保护类或实例属性不被外部污染而设计的。
定义实例方法
类除了拥有属性还有方法。
私有属性没有办法从外部访问,只能在类的内部操作;那如果外部需要操作私有属性怎么办?这个时候可以通过定义类或者实例的方法来操作私有属性。
实例的方法指的就是在类中定义的函数,实例方法的第一个参数永远都是self,self是一个引用,指向调用该方法的实例对象本身,除此以外,其他参数和普通函数是完全一样的。
注意,在外部调用实例方法时,是不需要显式传递self参数的。
class Animal:
def __init__(self,name,age):
self.__name = name
self.__age = age
def getAnimalInfo(self):
return 'my name is {},and age is {}'.format(self.__name,self.__age)
def setAnimalInfo(self,name,age = 10):
self.__name = name
self.__age = age
cat = Animal('kitty',2)
print(cat.getAnimalInfo())
cat.setAnimalInfo('huahua',3)
print(cat.getAnimalInfo())
定义类的方法
为了操作实例对象的私有属性,我们定义了实例方法;同样的,如果需要需要操作类的私有属性,则应该定义类的方法。
默认的,在class中定义的全部是实例方法,实例方法第一个参数 self
是实例本身。
类方法和实例方法不同的是,这里有两点需要特别注意:
- 类方法需要使用
@classmethod
来标记为类方法,否则定义的还是实例方法 - 类方法的第一个参数将传入类本身,通常将参数名命名为
cls
类方法无法获得任何实例变量,只能获得类的引用。因为是在类上调用,而非实例上调用。
class Animal:
__location = 'Asia'
def __init__(self,name,age):
self.name = name
self.age = age
@classmethod
def getLocation(cls):
return cls.__location;
@classmethod
def setLocation(cls,location):
cls.__location = location
cat = Animal('cat',2)
dog = Animal('dog',4)
print(Animal.getLocation())
Animal.setLocation('GuangDong')
print(Animal.getLocation())