1、*class ClassName()--创建类,类的命名规则为驼峰法,每个单词的首字母必须大写;Python2.7中创建类时,需要在括号内包含object,如class ClassName(object)
*类中的函数称为方法,有关函数的一切都适用于方法,唯一的差别在于调用方法的方式;
*__init__()这是一个特殊的方法,每当你根据类创建新的实例时,Python都会自动运行它;
开头和末尾各有两个下划线,这是一种约定,旨在避免默认方法和普通方法发生名称冲突。
*小写的名称指根据类创建的实例,
class Dog(): '''一次模拟小狗的简单尝试''' def __init__(self,name,age): '''初始化属性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('holiday',3) print("My dog's name is " + my_dog.name.title() + '.') print("My dog's age is " + str(my_dog.age) + '.') #用句点法来调用Dog类中定义的任何方法 my_dog.sit() my_dog.roll_over()
2、类中的每个属性都要有初始值,哪怕这个值是0或空字符,在有些情况下,可以设置默认值,在__init__()内指定初始值,如果你对某个属性这么做了,
就无需包含为它提供初始值的形参。
三种方法修改属性值:1、直接修改;2、通过方法修改;3、通过增量修改
#创建一个餐馆类,并修改属性值 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("The name of restaurant is %s."%self.restaurant_name) print("The cuisine type of restaurant is %s."%self.cuisine_type) print("[%s] people have dined in this restaurant."%self.number_served) def set_number_served(self,number): # 2通过方法修改属性值 self.number_served = number def increment_number_served(self,increment_num): #3通过增量修改属性值 self.number_served += increment_num '''这个增量就是餐馆每天的就餐人数''' print('I think the restaurant serves %s people a day.'%increment_num) def open(self): print("The restaurant is open!") restaurant = Restaurant('KFC','fast food') restaurant.number_served = 10 #1直接修改属性值 restaurant.describe_restaurant() restaurant.set_number_served(200) restaurant.describe_restaurant() restaurant.increment_number_served(300) restaurant.describe_restaurant()
3、继承:一个类继承另一个类时,它将自动获取另个一个类的所有属性和方法,原有的称为父类,新类称为子类,同时子类还可以定义自己特有的属性和方法;
__init__(self,name,age):
super().__init__(,name,age)
创建子类时,Python首先要完成的就是为父类的所有属性赋值;super是一个特殊的函数,帮助子类和父类关联起来,父类也叫superclass,名称因此而来。
Python2.7中函数super()需要两个实参:子类名和对象self。
#子类冰淇淋店继承父类餐馆 class Restaurant(): def __init__(self,restaurant_name,cuisine_type): self.restaurant_name = restaurant_name self.cuisine_type = cuisine_type def describe_restaurant(self): print("The name of restaurant is %s."%self.restaurant_name) print("The cuisine type of restaurant is %s."%self.cuisine_type) class IceCreamStand(Restaurant): def __init__(self,restaurant_name,cuisine_type): super().__init__(restaurant_name,cuisine_type) self.flavors = [] def show_flavors(self): print("The menu of icecreamstand is as follows:") for flavor in self.flavors: print('\t' + flavor) icecreamstand = IceCreamStand('Ice And Snow','icecream') icecreamstand.flavors = ['a','b','c','d'] icecreamstand.show_flavors()
4、将实例用作属性
#将Privileges实例用作Admin类的一个属性 class User(): def __init__(self,first_name,last_name,age): self.first_name = first_name self.last_name = last_name self.age = age self.login_attempts = 0 def describe_user(self): print("User's first name is %s."%self.first_name) print("User's last name is %s."%self.last_name) print("User's age is %d."%self.age) print("User logged in %d times."%self.login_attempts) def increment_login_attempts(self): self.login_attempts += 1 def reset_login_attempts(self): self.login_attempts = 0 def greet_user(self): print("Hello " + self.last_name + ' ' + self.first_name + ",long time no see,are you OK?") class Admin(User): def __init__(self,first_name,last_name,age): super().__init__(first_name,last_name,age) self.privileges = Privileges() class Privileges(): def __init__(self): self.privileges = ['can add post','can delete post','can ban user'] def show_privileges(self): print('Administrator have the following privileges:') for privilege in self.privileges: print('\t'+privilege) user = User('james','lebran',34) user.increment_login_attempts() user.describe_user() user.reset_login_attempts() user.describe_user() admin = Admin('james','lebran',34) admin.privileges.show_privileges()
5、导入类:方法同调用模块中的函数一样,模块中可以存放单个类或者多个类,使用import或者from...import..,*表示调出模块中所有类
collections模块中的一个类OrderedDict(),记录字典中键值对的添加顺序,少量数据看不出来效果;
from collections import OrderedDict favor_lang = OrderedDict() favor_lang['james'] = 'c' favor_lang['paul'] = 'c++' favor_lang['alice'] = 'python' for k,v in favor_lang.items(): print("%s's favorite language is %s."%(k.title(),v))
6、random模块包含以各种方式生成随机数的函数,randint()随机返回一个位于指定范围内的整数,范围两端的数字也会返回;
要了解标准库,请访问http://pymotw.com/
#摇骰子 from random import randint class Die(): def __init__(self,sides=6): self.sides = sides def roll_die(self): print(randint(1,self.sides)) die = Die(6) die.roll_die()
7、有时候,需要将类分散到多个模块中,以免模块太大,或在同一模块中存储不相关的类;
将类存储在多个模块时,你可能会发现一个模块中的类依赖于另一个模块中的类,这种情况下,可在前一个模块中导入必要的类。
8、练习题
#汽车-电动汽车-电池,给电池类添加一个更新电池容量的方法 class Car(): def __init__(self,make): self.make = make print('I have an %s.'%self.make) class ElectricCar(Car): def __init__(self,make): super().__init__(make) self.battery = Battery() class Battery(): def __init__(self,battery_size=70): self.battery_size = battery_size def get_range(self): if self.battery_size == 70: range = 240 elif self.battery_size == 85: range = 270 print('This car can go approximately %d miles on a full charge.'%range) def upgrade_battery(self): if self.battery_size != 85: self.battery_size = 85 my_car = Car('audi') electric_car = ElectricCar('tesla') electric_car.battery.get_range() electric_car.battery.upgrade_battery() electric_car.battery.get_range() my_battery = Battery(85) my_battery.get_range()