第九章 类

根据类来创建对象被称为实例化

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()

image

9.2 使用类和实例

9.2.1 给属性指定默认值

  • 类中的每个属性都必须有初始值,哪怕这个值是0或空字符串
  • 在方法__init__()内指定这种初始值是可行的,并且无需包含为它提供初始值的形参
    image

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)

image

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)

image

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())

image

牛客刷题

1.班级管理(97)

  • 注意输出形式
    image
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...
  • 直接添加属性
    image
    image
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添加属性
    image

image

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)

  • 内置函数:能直接运算
    image

image

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)

posted @ 2022-11-20 12:25  Trouvaille_fighting  阅读(36)  评论(0)    收藏  举报