定义
简单的声明如下所示:
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def get_name(self):
print(self.name)
p = Person("张三")
p.get_name()
print(p.name,p.age)
首字母大写的代表是类,调用的时候,表示实例化,区分函数调用,不过这只是规范而已。
变量
类变量
在定义类时,定义在类内部,所有方法外部的变量叫做类变量。例如下例中的 dogColor 类变量
# coding=utf-8
class Dog():
dogColor = "yellow"
def __init__(self, name, age):
self.name = name
self.age = age
def seeColor(self):
print(self.dogColor)
或者通过 类名.类变量 = 值
的方式来动态创建
# coding=utf-8
class Dog():
def __init__(self, name, age):
self.name = name
self.age = age
def seeSex(self):
print(self.dogColor)
Dog.Sex = "boy"
dog1 = Dog("阿黄", 12)
dog1.seeSex()
类变量修改只能通过 类名.类变量 = 值
来修改,不能通过 实例变量.类变量 = 值
来修改。并且此修改是全局性的,一旦修改,所有的实例调用都会改变。
实例变量
定义在类的所有方法内部定义,以 self.变量
出现的变量叫做实例变量。例如下例中的 name 和 age
# coding=utf-8
class Dog():
def __init__(self, name, age):
self.name = name
self.age = age
dog1 = Dog("阿黄", 12)
dog1.seeSex()
实例变量只能通过实例对象调用,不能通过类调用;实例变量属于实例对象私有的。
局部变量
在类方法内使用的普通变量,例如变量 legAmout
# coding=utf-8
class Dog():
def __init__(self, name, age):
self.name = name
self.age = age
legAmout = 4
dog1 = Dog("阿黄", 12)
dog1.seeSex()
全局变量
在类的方法里,变量前面加上 global,表示可以修改全局变量,如果不加 global 也可以访问,但是无法修改
# coding=utf-8
distance = 100
class Dog():
def __init__(self):
global distance
distance = 200
class Dog1():
def __init__(self):
print(distance) # 被修改成了200
dog1 = Dog()
dog2 = Dog1() # 输出200
构造函数
上例子中的 __init__
方法是构造函数
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
构造函数在实例化的时候会自动调用。有三个参数,形参 self 必不可少,而且必须位于其他形参的前面,实例化的时候将自动传入实参 self。每个与实例相关联的方法调用都自动传递实参 self,它是一个指向实例本身的引用。
方法
实例方法
一般我们在类当中定义的方法都是实例方法,定义中必须使用 self 关键字作为第一个参数,要使用实例方法,必须先把我们的类实例化才能使用。比如下面的个 Dog 类中的 name 方法。
# coding=utf-8
class Dog():
def __init__(self, name, age):
self.name = name
self.age = age
# 实例方法必须带有self参数
def dogName(self):
print("我是一只狗,名叫{}".format(self.name))
dog1 = Dog("阿黄", 12)
# 只能通过实例对象才能调用实例方法
dog1.dogName()
实例方法可以访问实例变量、类变量,使用时必须通过实例名来调用。
类方法
在定义函数的时候在前面加上 @classmethod
那么接下来定义的这个函数就被称为类方法,如下所示
# coding=utf-8
class Dog():
dog_dict = {
"大狗":3,
"二狗":4,
"三狗":5
}
def __init__(self, name, age):
self.name = name
self.age = age
@classmethod
def dogAge(cls):
print(cls.dog_dict)
# 类名来调用
Dog.dogAge()
类方法不会因为具体的哪个实例而改变,因此在定义时必须使用 cls (应该是 class 的简写,表示类变量) 作为第一个参数。
类方法可以使用类名或者实例来调用
dog1 = Dog("阿黄", 12)
dog1.dogAge()
# 或
Dog.dogAge()
类方法是可以访问类变量,当然也可以访问实例变量 (不过需要传入参数 self,并且在使用时需要把实例名传入函数中)。
# coding=utf-8
class Dog():
dog_dict = {
"大狗":3,
"二狗":4,
"三狗":5
}
def __init__(self, name, age):
self.name = name
self.age = age
@classmethod
def dogAge(cls, instance):
print(cls.dog_dict,instance.name)
# 类名来调用
dog1 = Dog("阿黄", 12)
Dog.dogAge(dog1) # 传入实例
静态方法
定义函数的时候在前面加上 @staticmethod
那么接下来定义的这个函数就被称为静态方法。静态方法不要求你强制传入任何参数(实例方法必须传入 slef,类方法必须传入 cls),因此这个函数对类变量和实例变量都是一无所知,你需要自己传入参数才能使用。
调用的时候,可以使用 实例名. 方法名
调用,或者 类名.方法名
调用。看例子
# coding=utf-8
class Dog():
dog_dict = {
"大狗":3,
"二狗":4,
"三狗":5
}
def __init__(self, name, age):
self.name = name
self.age = age
@staticmethod
def say():
print("旺旺!")
dog1 = Dog("阿黄", 12)
dog1.say()
Dog.say()
继承
简单的使用如下,继承 Person 类
class BlackPerson(Person):
def __init__(self, name, age):
super().__init__(name, age)
self.skin = "黑色皮肤" # 子类特有的属性
def get_skin(self):
print(self.skin)
p = BlackPerson("Jack张", 18)
p.get_addr()
p.get_skin()
Super () 是一个特殊函数,让你能够调用父类的方法。