以下都是基于python3.x
类继承的时候写不写object,是一样的。一样的。一样的。
看例子看例子:
>>> class NoObject():
... pass
...
>>> class FromObject(object):
... pass
...
>>> no_object = NoObject()
>>> from_object = FromObject()
>>> type(no_object)
<class 'NoObject'>
>>> type(from_object)
<class 'FromObject'>
python3的类都已经隐式继承了object,所以,python3中写不写继承object都是没有区别的。
类变量、实例变量
类变量:定义在类的定义之。例如:
class A:
class_variable = "I am class variable"
实例变量:以self.开头,在构造函数中常见。例如:
class A:
def __init__(self, a):
self.instance_variable = a
def print_a(self):
print(self.instance_variable)
实例和类都可以访问类变量,可以通过类名访问,也可以通过实例名访问。实例变量只能通过实例访问。例如:
class A:
class_variable = "I am class variable" # 类变量
def __init__(self, a):
self.instance_variable = a # 实例变量
def print_a(self):
print("I am {}".format(self.instance_variable))
a = A("instance_variable")
print("Use class: class variable is {}".format(A.class_variable)) # Use class: class variable is I am class variable
print("Use instance: class variable is {}".format(a.class_variable)) # Use instance: class variable is I am class variable
a.print_a() # I am instance_variable
A.print_a() # 报错
A.print_a(a) # I am instance_variable
类方法、实例方法、静态方法
类方法:第一个参数是cls(类本身),操作对象是类变量,可以使用@classmethod声明。
实例方法:第一个参数是self(实例),操作对象是实例变量。
静态方法:参数是传入的,操作对象是传入的参数,可以使用@staticmethod声明。
看例子:
class A:
name = "class_variable" # 类变量
# 构造函数
def __init__(self, a):
self.a = a # 静态变量
# 类方法
@classmethod
def class_method(cls):
print("I am class method")
print("my class variable is {}".format(cls.name))
# 实例方法
def instance_method(self):
print("I am instance method")
print("my a is {}".format(self.a))
# 静态方法
@staticmethod
def static_method(a, b):
print("I am static method")
print("my a and b is {}, {}".format(a, b))
print("class variable name is {}".format(A.name)) # class variable name is class_variable 通过类访问类变量
A.class_method() # I am class method 类调用类方法
A.instance_method() # 类调用实例方法报错 没有传入实例
instance_a = A("a")
A.instance_method(instance_a) # I am instance method 类传入实例调用实例方法
A.static_method("class_a", "class_b") # my a and b is class_a, class_b 类调用静态方法
instance_a = A("a")
print("class variable name is {}".format(instance_a.name)) # class variable name is class_variable 通过实例访问类变量
instance_a.class_method() # I am class method 实例调用类方法
instance_a.instance_method() # I am instance method 实例调用实例方法
instance_a.static_method("instance_a", "instance_b") # my a and b is instance_a, instance_b 实例调用静态方法