__init__()
首先,两个下划线开头的函数是声明该属性为私有,不能在类的外部被使用或访问。
__init__()支持带参数类的初始化,也可为声明该类的属性(类中的变量)。__init__函数(方法)的第一个参数必须为self,后续参数为自己定义。
__init__()又被称为构造器(constructor)。
例如:
class studetn:
# 定义一个类名为studetn
def __init__(self,idx):
# 定义初始化构造,这里使用init,还有别的属性比如reversed,iter之类的
self.idx=idx
# 初始化变量,方便继承
def runx(self):
# 定义运行函数,从上面继承变量
print self.idx
# 打印出idx的值,或者做一些别的处理
time.sleep(1)
a=studetn('a')
a.runx()
# 这是类的调用,一定要记得类的使用方法,首先传入参数,类赋值给一个变量a
# 然后调用这个类下面定义的函数
继承
1. 定义
python中的继承可以使用 class 子类(父类): 的语法格式来写,例如:
class Person(object): # 定义一个父类
def talk(self): # 父类中的方法
print("person is talking....")
class Chinese(Person): # 定义一个子类, 继承Person类
def walk(self): # 在子类中定义其自身的方法
print('is walking...')
c= Chinese()
c.talk() # 调用继承的Person类的方法
c.walk() # 调用本身的方法
# 输出
personis talking....
is walking...
2. 构造函数的继承
1)经典类的写法: 父类名称.__init__(self,参数1,参数2,...)
2)新式类的写法:super(子类,self).__init__(参数1,参数2,....)
class Person(object):
def __init__(self, name, age):
self.name= name
self.age= age
self.weight= 'weight'
def talk(self):
print("person is talking....")
class Chinese(Person):
def __init__(self, name, age, language): # 先继承,再重构
# 继承父类的构造方法
Person.__init__(self, name, age) # 也可以写成:super(Chinese,self).__init__(name,age)
self.language= language # 定义类的本身属性
def walk(self):
print('is walking...')
class American(Person):
pass
c= Chinese('bigberg',22,'Chinese')
如果我们只是简单的在子类Chinese中定义一个构造函数,其实就是在重构。这样子类就不能继承父类的属性了。所以我们在定义子类的构造函数时,要先继承再构造,这样我们也能获取父类的属性了。
子类构造函数基础父类构造函数过程如下:
实例化对象c ----> c 调用子类__init__() ---- > 子类__init__()继承父类__init__() ----- > 调用父类 __init__()
3. 方法重写
如果我们对基类/父类的方法需要修改,可以在子类中重构该方法。如下的talk()方法:
class Person(object):
def __init__(self, name, age):
self.name= name
self.age= age
self.weight= 'weight'
def talk(self):
print("person is talking....")
class Chinese(Person):
def __init__(self, name, age, language):
Person.__init__(self, name, age)
self.language= language
print(self.name,self.age,self.weight,self.language)
def talk(self): # 子类 重构方法
print('%s is speaking chinese' % self.name)
def walk(self):
print('is walking...')
c= Chinese('bigberg',22,'Chinese')
c.talk()
# 输出
# bigberg22 weight Chinese
# bigbergis speaking chinese
静态方法
静态方法由类调用,无默认参数。将实例方法参数中的self去掉,然后在方法定义上方加上@staticmethod,就成为静态方法。
它属于类,和实例无关。建议只使用类名.静态方法的调用方式。(虽然也可以使用实例名.静态方法的方式调用)
class ff:
@staticmethod
def runx():
print requests.get('http://www.langzi.fun').status_code
ff.runx()
静态方法没有类似 self、cls 这样的特殊参数,因此 Python 解释器不会对它包含的参数做任何类或对象的绑定。也正因为如此,类的静态方法中无法调用任何类属性和类方法。
经常有一些跟类有关系的功能但在运行时又不需要实例和类参与的情况下需要用到静态方法. 比如更改环境变量或者修改其他类的属性等能用到静态方法. 这种情况可以直接用函数解决, 但这样同样会扩散类内部的代码,造成维护困难。
类方法
类方法由类调用,采用@classmethod装饰,至少传入一个cls(代指类本身,类似self)参数。执行类方法时,自动将调用该方法的类绑定到cls(注意这里不是对象哦)。
建议只使用类名.类方法的调用方式。(虽然也可以使用实例名.类方法的方式调用)
class CLanguage:
# 类构造方法,也属于实例方法
def __init__(self):
self.name = "C语言中文网"
self.add = "http://c.biancheng.net"
# 下面定义了一个类方法
@classmethod
def info(cls):
print("正在调用类方法",cls)
# 使用类名直接调用类方法
CLanguage.info()
# 使用类对象调用类方法
clang = CLanguage()
clang.info()