类与对象
- 2021-10-09 23:17:23
- admin
- 1773
- 最后编辑: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}")