类与对象

2021-10-09 23:17:23
admin
1455
最后编辑:admin 于 2022-11-24 20:28:40

创建类

python 使用 class 关键字声明一个类,后跟要创建的类名。类名首字母大写,在 python 中,首字母大写的名称指的是类。

class Person:
    """文档字符串,描述类的功能"""
    def __init__(self, name, age):
        """构造方法,初始化成员属性"""
        self.name = name
        self.age = age
    def say(self):
        """定义一个成员方法"""
        print('Hello world!')

对于类中方法的定义,形参 self 必不可少,且必须是位于第一个形参。调用方法时,对象会自动传递实参 self(不需要我们手动显式传递),self 是一个指向对象本身的引用,让对象能够访问类中的属性和方法。

在类的方法中,可以使用 self.属性名 的方式来访问类的属性。

__init__() 构造方法

__init__() 是一个特殊方法(开头和结尾都是两个下划线),每当使用类实例化一个对象时,python 就会自动运行它。

静态方法

类属性是类的共同特征属性。

每个实例对象独有的属性,称之为类的实例属性。实例属性通常是在类的初始化方法 __init__ 里面定义的。

类的静态方法要在方法定义 上面加上 @staticmethod 的修饰。且没有 self 参数。调用时直接使用 类名.方法() 来访问。

静态方法是不能访问实例属性的。

#!/usr/bin/python3
class Person:
    """the Person class"""
    country = "China"  # 类属性
    def __init__(self, name, age, addr):
        """定义实例属性"""
        self.name = name
        self.age  = age
        self.addr = addr
    
    @staticmethod
    def sleep():
        """the staticmethod"""
        print(".zZ")
        
    def say(self):
        """the say function"""
        print(f"hello,my name is {self.name},I am {self.age} years old and I come from {self.addr}.")
person1 = Person('GavinHsueh', 31, 'qingdao')
person1.say()
Person.sleep()

实例化对象

通过类可以创建任意数量的对象。python 中,通过调用与类名同名的函数,来调用类的构造方法 __init__(),从而实例化一个对象。然后,我们就可以通过使用 对象名.属性名对象名.方法名() 来访问对象的属性和方法。

person1 = Person('Jack', 18)
person1.name    #访问属性
person1.say()     #调用方法

可以通过对象访问属性的方式,来直接修改属性的值。

person1.age = 20

继承

与其他面向对象编程语言类似,python的类也有继承的特性。子类继承父类(也叫超类)的所有属性和方法,同时还可以定义自己的属性和方法。

在父类的基础上创建一个其子类时,通常要调用父类的构造方法 __init__()。这将初始化在父类 __init__() 方法中定义的所有属性,从而让子类包含这些属性。

#!/usr/bin/python3
class Person:
    """文档字符串,描述类的功能"""
    def __init__(self, name, age):
        """构造方法,初始化成员属性"""
        self.name = name
        self.age = age
    def say(self):
        """定义一个成员方法"""
        print('Hello world!')
class Son(Person):
    """创建一个子类"""
    def __init__(self, name, age):
        """初始化父类的属性"""
        super().__init__(name, age)
        self.favourite = "game"  #还可以设置子类自己的实例属性
    def run(self):
        print(f"{self.name} gogogo!")
son1 = Son('Tom', 5)
print(f"Hello {son1.name}")

创建子类时,父类必须包含在当前文件中,且位于子类的前面。

定义子类时,必须在圆括号内指定父类的名称。

super() 能让你调用父类的方法。(父类也叫超类)

可以对父类的方法进行重写。在子类中定义一个与要重写的父类方法同名的方法,这样python将不会考虑这个父类的方法,而只关注你在子类中定义的相应方法。

导入类

python 允许将类存储在模块中,然后在主程序中导入所需的模块。一个模块中可以存储任意数量的类。

与导入方法类似,导入类也有两种方式:

from 模块名 import 类名

import 模块名

例如,我们将 Person 类单独存储在一个模块文件中(person.py),然后在 test.py 中导入它。

person.py文件:

class Person:
    """文档字符串,描述类的功能"""
    def __init__(self, name, age):
        """构造方法,初始化成员属性"""
        self.name = name
        self.age = age
    def say(self):
        """定义一个成员方法"""
        print('Hello world!')

test.py 文件:

from person import Person
person1 = Person('Lucy', 17)
print(f"Hello {person1.name}")
或:
#导入整个模块,使用句点访问需要的类。
improt person
person1 = person.Person('Lucy', 17)
print(f"Hello {person1.name}")