Python学习笔记之类

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

猜你喜欢

转载自www.cnblogs.com/charliedaifu/p/9934219.html