面向对象
定义
- 程序设计的范式
- 抽象并建立对象模型
使用
# 定义与实例化
class Animal: pass #python2 只继承少部分内建函数
class Animal(): pass
class Animal(object): pass
dog = Animal()
# 实例属性的定义
dog.name = 'xiaowang'
dog.age = 14
print dog.name,dog.age
# 实例属性的初始化
class Animal():
def __init__(self,name,age): #self不可漏掉
self.name = name
self.age = age
dog = Animal('xiaowang',16)
cat = Animal('xiaochen',17)
print dog.name,dog.age
print cat.name,cat.age
# 类属性
class Animal(object):
localtion = 'Asia'
def __init__(self, name, age):
self.name = name
self.age = age
dog = Animal('wangwang', 1)
cat = Animal('mimi', 3)
print dog.localtion # ==> Asia
print cat.localtion # ==> Asia
print Animal.localtion # ==> Asia 类属性,也可以通过类名直接访问
Animal.localtion = 'Africa' #动态修改
print(cat.localtion) # ==>Africa
print(dog.localtion) # ==>Africa
# 类属性与实例属性
class Animal(object):
localtion = 'Asia'
def __init__(self, name, age, localtion):
self.name = name
self.age = age
self.localtion = localtion
'''
实例属性优先级高于类属性
不可通过实例属性修改类属性,只会给实例绑定对应的属性
'''
# 私有属性
# 类私有属性
class Animal(object):
__localtion = 'Asia'
# 实例私有属性
class Animal(object):
def __init__(self, name, age, localtion):
self.name = name
self.age = age
self.__localtion = localtion
dog = Animal('wangwang', 1, 'GuangDong')
print(dog.name) # ==> wangwang
print(dog.age) # ==> 1
print(dog.__localtion)
'''
在外部访问私有属性将会抛出异常,提示没有这个属性。
虽然私有属性无法从外部访问,但是,从类的内部是可以访问的。私有属性是为了保护类或实例属性不被外部污染而设计的。
'''
'''定义实例方法
实例的方法指的就是在类中定义的函数,实例方法的第一个参数永远都是self,self是一个引用,指向调用该方法的实例对象本身,除此以外,其他参数和普通函数是完全一样的。
'''
class Animal(object):
__kinds = '2'
def __init__(self, name, age, localtion):
self.__name = name
self.__age = age
self.__localtion = localtion
def set_name(self,name):
self.__name = name
def set_age(self,age):
self.__age = age
def set_localtion(self,localtion):
self.__localtion = localtion
def get_name(self):
return self.__name
def get_age(self):
return self.__age
def get_localtion(self):
return self.__localtion
def get_kind(self):
return Animal.__kinds #self.__kinds则是实例私有属性
def get_info(self):
return 'name = {}, age = {}, localtion = {}'.format(self.__name, self.__age, self.__localtion)
dog = Animal('wangwang', 1, 'GuangDong')
print dog.get_name()
print dog.get_age()
print dog.get_localtion()
print dog.get_kind()
print dog.get_info()
'''
在上面的定义,name是实例的私有属性,从外部是无法访问的,而get_name(self) 就是一个实例方法,在实例方法里面是可以操作私有属性的,注意,它的第一个参数是self。
另外,__init__(self, name)其实也可看做是一个特殊的实例方法。
注意,在外部调用实例方法时,是不需要显式传递self参数的。
另外,通过定义实例方法来操作私有属性的这种方法是推荐的,这种数据封装的形式除了能保护内部数据一致性外,还可以简化外部调用的难度。
'''
'''定义类方法
1、类方法需要使用@classmethod来标记为类方法,否则定义的还是实例方法
2、类方法的第一个参数将传入类本身,通常将参数名命名为 cls,下面的 cls.__count 实际上相当于Animal.__count。
此外,因为是在类上调用,而非实例上调用,因此类方法无法获得任何实例变量,只能获得类的引用。
'''
class Animal():
__count = 10
def __init__(self,name,age):
self.name = name
self.age = age
@classmethod
def set_count(cls,count):
cls.__count = count
@classmethod
def get_count(cls):
return cls.__count
print Animal.get_count()