Python类和对象教程- Python Class学习指南

silverwq
2023-01-05 / 0 评论 / 386 阅读 / 正在检测是否收录...

定义

简单的声明如下所示:

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 () 是一个特殊函数,让你能够调用父类的方法。

0

评论 (0)

取消