第九章 类
根据类来创建对象被称为实例化
9.1 创建和使用类
9.1.1 创建Dog类
1. 方法 __ init__(self,其他形参)
- 开头和末尾各有两个下划线
- 自动传入实参self:它是一个指向实例本身的引用,让实例能够访问类中的属性和方法
- 创建实例时,只需给形参提供值
- 类中的其他方法,可以用实例进行调用
9.1.2 根据类创建实例
首字母大写的名称为Dog为类,小写的名称(my_dog)是根据类创建的实例
1.访问属性
- 要访问实例的属性,可使用句号表示法。
2.调用方法
- 根据类创建实例后,就可以使用句号表示法来调用类中定义的任何方法
3.创建多个实例
- 根据需求创建任意熟练的实例
- 每个实例都存储在不同的变量中,或占用列表或字典的不同位置
class Dog():
    def __init__(self,name,age):
        self.name=name
        self.age=age
    def sit(self):
        print(self.name.title()+" is now sitting.")
    def roll_over(self):
        print(self.name.title()+" rolled over.")
my_dog=Dog("lili",3)
he_dog=Dog("xixi",2)
#访问属性
print(my_dog.name)
print(my_dog.age)
print(he_dog.name)
print(he_dog.age)
#访问方法
my_dog.sit()
my_dog.roll_over()

9.2 使用类和实例
9.2.1 给属性指定默认值
- 类中的每个属性都必须有初始值,哪怕这个值是0或空字符串
- 在方法__init__()内指定这种初始值是可行的,并且无需包含为它提供初始值的形参
  
9.2.2 修改属性的值
1. 直接修改属性的值
- 要修改属性的值,最简单的方式是通过实例直接访问它、
class Dog():
    def __init__(self,name,age):
        self.name=name
        self.age=age
        self.color='white'
    def sit(self):
        print(self.name.title()+" is now sitting.")
    def roll_over(self):
        print(self.name.title()+" rolled over.")
my_dog=Dog("lili",3)
#直接修改属性的值
my_dog.color='black' 
#访问属性
print(my_dog.color)
2.通过方法修改属性的值
- 无需直接访问属性,可将值传递给一个方法,由它再内部进行更新
class Dog():
    def __init__(self,name,age):
        self.name=name
        self.age=age
        self.color='white'
    def sit(self):
        print(self.name.title()+" is now sitting.")
    def roll_over(self):
        print(self.name.title()+" rolled over.")
    def update_color(self,color):
        self.color=color
my_dog=Dog("lili",3)
#利用方法修改属性
my_dog.update_color('black')
#访问属性
print(my_dog.color)
3.通过方法对属性的值进行递增
- 将属性值递增特定的量
class Dog():
    def __init__(self,name,age):
        self.name=name
        self.age=age
        self.color='white '
    def sit(self):
        print(self.name.title()+" is now sitting.")
    def roll_over(self):
        print(self.name.title()+" rolled over.")
    def update_color(self,color):
        self.color=color
    def add_color(self,color):
        self.color+=color
my_dog=Dog("lili",3)
#利用方法递增属性
my_dog.add_color('black')
#访问属性
print(my_dog.color)

9.3 继承
- 一个类继承另一个类时,它将自动获得另一个类的所有属性和方法
- 原有的类称为父类,新类称为子类
- 子类继承了其父类的所有属性和方法
9.3.1 子类的方法 init()
- 首先的任务是给父类的所有属性赋值
- 父类必须包含在当前文件中,且位于子类前面
- 在子类中,必须在括号内指定父类的名称
- super()是一个特殊函数,将子类与父类关联起来
- 父类也称为超类(superclass)
class Dog():
    def __init__(self,name,age):
        self.name=name
        self.age=age
        self.color='white '
    def sit(self):
        print(self.name.title()+" is now sitting.")
    def roll_over(self):
        print(self.name.title()+" rolled over.")
    def update_color(self,color):
        self.color=color
    def add_color(self,color):
        self.color+=color
class BanDianDog(Dog):#指定父类
    def __init__(self,name,age):
        super().__init__(name,age) #给父类的属性赋值
my_dog=BanDianDog("lili",3)#定义子类
#调用方法
my_dog.add_color('black')
#访问属性
print(my_dog.color)
9.3.2 给子类定义属性和方法
- 添加区分子类和父类所需的新属性和方法
class Dog():
    def __init__(self,name,age):
        self.name=name
        self.age=age
        self.color='white '
    def sit(self):
        print(self.name.title()+" is now sitting.")
    def roll_over(self):
        print(self.name.title()+" rolled over.")
    def update_color(self,color):
        self.color=color
    def add_color(self,color):
        self.color+=color
class BanDianDog(Dog):#指定父类
    def __init__(self,name,age):
        super().__init__(name,age) #给父类的属性赋值
        self.ears="long" #添加子类的属性
    def print_ears(self):#添加子类的方法
        print(self.ears)
my_dog=BanDianDog("lili",3)#定义子类
#访问属性和方法
print(my_dog.ears)
my_dog.print_ears()
9.3.3 重写父类的方法
- 只要父类的方法不符合子类模拟的实物的行为,都可对其重写
class Dog():
    def __init__(self,name,age):
        self.name=name
        self.age=age
        self.color='white '
    def sit(self):
        print(self.name.title()+" is now sitting.")
    def roll_over(self):
        print(self.name.title()+" rolled over.")
    def update_color(self,color):
        self.color=color
    def add_color(self,color):
        self.color+=color
class BanDianDog(Dog):#指定父类
    def __init__(self,name,age):
        super().__init__(name,age) #给父类的属性赋值
        self.ears="long" #添加子类的属性
    def print_ears(self):#添加子类的方法
        print(self.ears)
    def update_color(self,color):
        self.color=color+" white black"
my_dog=BanDianDog("lili",3)#定义子类
#访问属性
my_dog.update_color("yellow")
print(my_dog.color)

9.3.4 将实例作为属性
- 比如将电池创建为一个类,赋值给汽车这个电池的属性
self.battery=Battery()
9.4 导入类
9.4.1 导入单个类
- 将类的定义和类的调用却分开
- 将类打包成 文件名.py
from 文件名 import 类名
#对类进行引用
9.4.2 在一个模块中存储多个类
- 在一个文件内根据模块的相关性,定义多个类
9.4.3 从一个模块中导入多个类
from 文件名 import 类名、类名
9.4.4 导入这个模块
import 文件名
9.4.5 导入模块中的所有类
from 文件名 import *
9.5 python标准库
- python的标准库对应的模块为collections
- 举例Collections中的OrderedDict的方法:该方法能够实现创建字典并记录其中的键-值对的添加顺序
from collections import OrderedDict
name_dog=OrderedDict()
name_dog['lili']='dog1'
name_dog['xixi']='dog2'
name_dog['hihi']='dog3'
for name,dog in name_dog.items():
    print(name.title()+"'s dog is "+dog.title())

牛客刷题
1.班级管理(97)
- 注意输出形式
  
class Student:
    def __init__(self,name,sno,score,level) -> None:
         self.name=name
         self.sno=sno
         self.score=score
         self.level=level
    def print_message(self):
        s=self.level
        print(self.name+"'s student number is "+self.sno+", and his grade is "+str(self.score)+". He submitted "+str(len(s))+" assignments, each with a grade of",*s)
        
name=input()
sno=input()
score=int(input())
level=list(input().split(" "))
stu=Student(name,sno,score,level)
stu.print_message()
2. 修改属性(98)
- try...except...
- 直接添加属性
  
  
class Employee:
    def __init__(self,name,salary) -> None:
        self.name=name
        self.salary=salary
    def printclass(self):
        try:
            print("{}'salary is {}, and his age is {}".format(self.name,self.salary,self.age))
        except:
            print("Error! No age")
name=input()
salary=int(input())
e=Employee(name,salary)
e.printclass()
e.age=int(input()) #直接添加属性
e.printclass()
3. 修改属性(99)
- 自带方法hasattr验证是否存在某个属性
- 自带方法setattr添加属性
  

class Employee:
    def __init__(self, name, salary) -> None:
        self.name = name
        self.salary = salary
    def printclass(self):
        try:
            print(
                "{}'salary is {}, and his age is {}".format(
                    self.name, self.salary, self.age
                )
            )
        except:
            print("Error! No age")
    def setattr(self,age):
        if self.age is None:
            self.age=age
        else:
            self.printclass()
name = input()
salary = int(input())
age=int(input())
e = Employee(name, salary)
if hasattr(e,'age'):
    e.printclass()
else:
    print(False)
    setattr(e,'age',age)
    e.printclass()
4. 重载运算(100)
- 内置函数:能直接运算
  

import sys
class Coordinate:
    def __init__(self,x,y) -> None:
        self.x=x
        self.y=y
    def __str__(self) :
        print((self.x,self.y))
    def __add__(self,other):
        return (self.x+other.x,self.y+other.y)
x1,y1=map(int,input().split())
x2,y2=map(int,input().split())
c1=Coordinate(x1,y1)
c2=Coordinate(x2,y2)
print(c1+c2)

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号