python学习9

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/D_east/article/details/79458881

面向对象的语言,不得不说到类了,跟函数类似,可以放在模块里导出使用,而且用法也比函数多,类中定义的函数为类的方法。定义一个类,需要用到关键字'class'

class car():                                         #定义一个类,类名为car
    def __init__(self,name,model,age):               #这是类的特殊方法,每次类实例化时都会调用它,self指向的是实例,后面是类的属性
        self.name=name
        self.model=model
        self.age=age
    def car_start(self):                             #类的方法,可以做一些实际操作
        print(self.name+self.model+'使用中')
    def car_stop(self):
        print(self.name+self.model+'未使用')

my_car=car('audi','A4',4)                            #实例化类
print(my_car.name+ ' '+my_car.model+' '+str(my_car.age))
my_car.car_start()                                   #调用方法

类也可以实例化多次

小练习

'''
创建一个名为Restaurant 的类,其方法__init__()设置两个属性:
restaurant_name 和cuisine_type。创建一个名为describe_restaurant()的方法和一个
名为open_restaurant()的方法,其中前者打印前述两项信息,而后者打印一条消息,
指出餐馆正在营业。
根据这个类创建一个名为restaurant 的实例,分别打印其两个属性,再调用前述
两个方法。
'''
class Restaurant():
    def __init__(self,restaurant_name,cuisine_type):
        self.restaurant_name=restaurant_name
        self.cuisine_type=cuisine_type

    def describe_restaurant(self):
        print(self.restaurant_name,self.cuisine_type)
    def open_restaurant(self):
        print('正在营业')

my_restaurnat=Restaurant('mill','good')
print(my_restaurnat.restaurant_name,my_restaurnat.cuisine_type)
my_restaurnat.describe_restaurant()
my_restaurnat.open_restaurant()
'''
:创建一个名为User 的类,其中包含属性first_name 和last_name,还有
用户简介通常会存储的其他几个属性。在类User 中定义一个名为describe_user()的方
法,它打印用户信息摘要;再定义一个名为greet_user()的方法,它向用户发出个性化
的问候。
创建多个表示不同用户的实例,并对每个实例都调用上述两个方法。
'''
class User():
    def __init__(self,first_name,last_name,sex):
        self.first_name=first_name
        self.last_name=last_name
        self.sex=sex
    def describe_user(self):
        print(self.first_name,self.last_name,self.sex)
    def greet_user(self):
        print('Hello,'+self.first_name.title()+self.last_name)

user1=User('mike','jin','man')
user2=User('ming','ka','woman')
user1.describe_user()
user1.greet_user()
user2.describe_user()
user2.greet_user()

前面学的类属性都是参数传递过去的,而且每个属性都必须初始化,否则程序会出错。属性初始化除了参数传递外,也可以在类的特殊方法里定义,比如

class User():
    def __init__(self,first_name,last_name,sex):
        self.first_name=first_name
        self.last_name=last_name
        self.sex=sex
        self.age=0                                       #初始化年龄为0

如果需要对这属性做修改,可以直接修改属性的值,或者在方法里修改

class User():
    def __init__(self,first_name,last_name,sex):
        self.first_name=first_name
        self.last_name=last_name
        self.sex=sex
        self.age=0                                       #初始化年龄为0
'
'
'
user1=User('mike','jin','man')
user1.age=88                                            #直接修改
 def age_change(self,age_):                             #方法
        self.age=age_                                   #对属性赋值

user1=User('mike','jin','man')
user1.age_change(30)

小练习

'''在之前的练习中,添加一个名为number_served的属性,并将其默认值设置为0。
根据这个类创建一个名为restaurant 的实例;打印有
多少人在这家餐馆就餐过,然后修改这个值并再次打印它。
添加一个名为set_number_served()的方法,它让你能够设置就餐人数。调用这个
方法并向它传递一个值,然后再次打印这个值。
添加一个名为increment_number_served()的方法,它让你能够将就餐人数递增。
调用这个方法并向它传递一个这样的值:你认为这家餐馆每天可能接待的就餐人数'''
class Restaurant():
    def __init__(self,restaurant_name,cuisine_type):
        self.restaurant_name=restaurant_name
        self.cuisine_type=cuisine_type
        self.number_served=0

    def describe_restaurant(self):
        print(self.restaurant_name,self.cuisine_type)
    def open_restaurant(self):
        print('正在营业')

restaurant=Restaurant(1,2)
restaurant.number_served=20                 #实例化后对属性修改
print('人数=',restaurant.number_served)
restaurant.number_served=30                 #再次修改
print('人数=',restaurant.number_served)
'''User 类中,添加一个名为
login_attempts 的属性。编写一个名为increment_login_attempts()的方法,它将属性
login_attempts 的值加1。再编写一个名为reset_login_attempts()的方法,它将属性
login_attempts 的值重置为0。
根据User 类创建一个实例,再调用方法increment_login_attempts()多次。打印属
性login_attempts 的值,确认它被正确地递增;然后,调用方法reset_login_attempts(),
并再次打印属性login_attempts 的值,确认它被重置为0。'''
class User():
    def __init__(self,first_name,last_name,sex):
        self.first_name=first_name
        self.last_name=last_name
        self.sex=sex
        self.login_attempts=0
    def increment_login_attempts(self):
        self.login_attempts+=1
    def reset_login_attempts(self):
        self.login_attempts=0
    def describe_user(self):
        print(self.first_name,self.last_name,self.sex)
    def greet_user(self):
        print('Hello,'+self.first_name.title()+self.last_name)

user_test=User(1,2,3)
for i in range(5):
    user_test.increment_login_attempts()
    print(user_test.login_attempts)

user_test.reset_login_attempts()
print(user_test.login_attempts)

继承

继承是类的一个重要特性,你要编写的类是另一个现成类的特殊版本,可使用继承。一个类继承另一个类时,它将自动获得另一个类的所有属性和方法;原有的类称为父类,而新类称为子类。子类继承了其父类的所有属性和方法,同时还可以定义自己的属性和方法,继承的用法:

class User():
    def __init__(self,first_name,last_name,sex):
        self.first_name=first_name
        self.last_name=last_name
        self.sex=sex
        self.login_attempts=0
    def increment_login_attempts(self):
        self.login_attempts+=1
    def reset_login_attempts(self):
        self.login_attempts=0
    def describe_user(self):
        print(self.first_name,self.last_name,self.sex)
    def greet_user(self):
        print('Hello,'+self.first_name.title()+self.last_name)

class chinese(User):
    def __init__(self,first_name,last_name,sex):
        super().__init__(first_name,last_name,sex)
chinese_test1=chinese("张",'高','男')
chinese_test1.greet_user()                                  #子类继承父类后,可以使用父类的方法
上面的例子很简单,User是父类,chinese是子类,首先父类与子类在同一个文件中,且一定要在子类前,另外,定义子类时,括号中是父类的类名。

super()是一个特殊函数,帮助Python将父类和子类关联起来。这行代码让Python调用ElectricCar的父类的方法__init__(),让ElectricCar实例包含父类的所有属性。父类也称为超类(superclass),名称super因此而得名

也可以给子类定义新的属性和方法,另外,如果你觉得父类中有的方法多余了,可以将它重写,重写后实例化子类时,这个方法就会调用子类中的


小练习

'''冰淇淋小店是一种特殊的餐馆。编写一个名为IceCreamStand 的
类,让它继承你为完成练习9-1 或练习9-4 而编写的Restaurant 类。这两个版本的
Restaurant 类都可以,挑选你更喜欢的那个即可。添加一个名为flavors 的属性,用于
存储一个由各种口味的冰淇淋组成的列表。编写一个显示这些冰淇淋的方法。创建一个
IceCreamStand 实例,并调用这个方法。class Restaurant():'''
class Restaurant():
    def __init__(self,restaurant_name,cuisine_type):
        self.restaurant_name=restaurant_name
        self.cuisine_type=cuisine_type

    def describe_restaurant(self):
        print(self.restaurant_name,self.cuisine_type)
    def open_restaurant(self):
        print('正在营业')
class IceCreamStand(Restaurant):
    def __init__(self,restaurant_name,cuisine_type):
        super().__init__(restaurant_name,cuisine_type)
        self.flavors=['apple','orange','banane']
    def flavors_to(self):
        for i in self.flavors:
            print (i)
test1=IceCreamStand('go','min')
test1.flavors_to()
'''管理员是一种特殊的用户。编写一个名为Admin 的类,让它继承你为
完成练习9-3 或练习9-5 而编写的User 类。添加一个名为privileges 的属性,用于存
储一个由字符串(如"can add post"、"can delete post"、"can ban user"等)组成的
列表。编写一个名为show_privileges()的方法,它显示管理员的权限。创建一个Admin
实例,并调用这个方法。'''
class User():
    def __init__(self,first_name,last_name,sex):
        self.first_name=first_name
        self.last_name=last_name
        self.sex=sex
    def describe_user(self):
        print(self.first_name,self.last_name,self.sex)
    def greet_user(self):
        print('Hello,'+self.first_name.title()+self.last_name)
class Admin(User):
    def __init__(self,first_name,last_name,sex):
        super().__init__(first_name,last_name,sex)
        self.privileges=["can add post","can delete post","can ban user"]
    def show_privileges(self,n):
        print(self.first_name+self.last_name+" "+self.privileges[n])

test1=Admin('刘','辉','男')
test1.show_privileges(1)
''':编写一个名为Privileges 的类,它只有一个属性——privileges,其中
存储了练习9-7 所说的字符串列表。将方法show_privileges()移到这个类中。在Admin
类中,将一个Privileges 实例用作其属性。创建一个Admin 实例,并使用方法
show_privileges()来显示其权限'''
class User():
    def __init__(self,first_name,last_name,sex):
        self.first_name=first_name
        self.last_name=last_name
        self.sex=sex
class Privileges():
    def __init__(self):
        self.privileges=["can add post","can delete post","can ban user"]
    def show_privileges(self,n):
        print(self.privileges[n])
class Admin(User):
    def __init__(self,first_name,last_name,sex):
        super().__init__(first_name,last_name,sex)
        self.adm=Privileges()
    

test1=Admin('刘','辉','男')
print(test1.first_name+test1.last_name)
test1.adm.show_privileges(1)       
导入类

导入类和之前学到的导入模块的方法一样的,用import就可以了。如果在一个文件中有多个类,这样可以会影响美观和可读性,将一个类或多个类写到另一个文件中,当需要时将它导入即可。举个例子,一个文件,名为Car.py,文件中有类mycar,yourcar,freecar,然后将yourcar和freecar转移到文件car.py中

from car import yourcar                                             #从car中导入类yourcar
from car import yourcar,freecar                                     #从car中导入类yourcar和freecar
from car import *                                                   #从car中导入所有类
import car                                                          #导入整个模块

小练习

'''
模块random 包含以各种方式生成随机数的函数,其中的randint()返回
一个位于指定范围内的整数,例如,下面的代码返回一个1~6 内的整数:
from random import randint
x = randint(1, 6)
请创建一个Die 类,它包含一个名为sides 的属性,该属性的默认值为6。编写一
个名为roll_die()的方法,它打印位于1 和骰子面数之间的随机数。创建一个6 面的骰
子,再掷10 次。
创建一个10 面的骰子和一个20 面的骰子,并将它们都掷10 次。
'''
from random import randint
class Die():
    def __init__(self,sides):
        self.sides=sides
    def roll_die(self):
        x=randint(1,self.sides)
        print(x)
        
die=Die(10)
for i in range(10):
    die.roll_die()
        


猜你喜欢

转载自blog.csdn.net/D_east/article/details/79458881
今日推荐