1)类的重写
class parent(object): # 定义父类的时候,一定要写继承object类,否则会报错
name = 'parent'
sex = 'F'
def __init__(self,address,age):
self.address = address
self.age = age
# print('My name is {0}'.format(self.name))
def get_name(self):
return self.name
def get_sex(self):
return self.sex
class child(parent):
name = 'child'
sex = 'M'
def __init__(self,address,age):
# 单继承时super()和__init__()实现的功能是类似的
# parent.__init__(self,address,age)
# 实现父类的构造器中的方法,多重继承时建议使用super可以避免__init__重复调用
super(child,self).__init__(address,age)
# print('My name is {0}'.format(self.name))
def hello(self):
print('hello world')
a = child('chengdu',100) # 当实例化一个类时,__init__下的方法会自动执行
print(a.address)
print(a.age)
# 从super()方法可以看出,super()的第一个参数可以是继承链中任意一个类的名字,
# 如果是本身就会依次继承下一个类;
# 如果是继承链里之前的类便会无限递归下去;
# 如果是继承链里之后的类便会忽略继承链汇总本身和传入类之间的类;
运行结果:
chengdu
100
2)类的私有变量
class A(object):
_name = 'Feng' # 受保护的变量,只允许本身和子类进行访问,
# 当使用“from xx import *”时不会将带一个下划线的对象引入
__sex = 'F' # 双下划线的表示的是私有类型(private)的变量,只允许该类本身进行访问,外界无法访问
def hello(self): # 类方法必须包含参数 self
print(self._name)
print(self.__sex)
def get_sex(self): # 需要操作私有变量时,需要自己在类中写get/set等方法
return self.__sex
a = A()
print (a._name)
# print (a.__sex) # 报错,实例不能访问私有变量
print(a._A__sex) # python不允许实例化的类访问私有数据,
# 但可以使用 object._className__attrName 访问属性
a.hello()
print(a.get_sex())
# 说明:__xx__: 定义的是特殊方法,一般是系统定义名字 ,类似 __init__() 之类的,
# 只有当文档有说明时使用,不要自己定义这类变量
运行结果:
Feng
F
Feng
F
F