Python 类 初学者笔记

面对象编程:编写表现世界中的事物和景象的类,并基于这些类创建对象,被创建的对象称为实例化。

创建类

class Dog():    #Python中类名称中的首字母要大写

    def __init__(self, name, age):#我是一个构造器
    #类中的函数都称为【方法】,init__()是个特殊的方法,每当我们根据Dog类创建实例时,Python都会自动的运行它
    #self必不可少且必须位于其它形参前面,
    # 每个与类相关的方法调用都自动传入self,self让实例能够访问类中的属性和方法

        self.name = name#以【self】为前缀的变量,可供类中所有【方法】使用,也可通过【实例】访问,我们称其为【属性】
        self.age = age

    def sit(self):
#self会自动传递name与age
        print(self.name.title() + " is now sitting.")
    def roll_over(self):

        print((self.name.title() + " rolled over!"))

 根据类创建实例

my_dog = Dog('willie',6) #根据类创建的实例名称应用小写
print("My dog's name is " + my_dog.name.title() + ".")#__init__并未显式的包含return语句,但Python自动返回了这条小狗的实例(name与age)
print("My dog is " + str(my_dog.age) + " years old.")
#print(my_dog.name + my_dog.age)调用属性相加 my_dog.sit()#实例中调用方法,Python在类Dog中查找方法sit()并运行其代码 my_dog.roll_over()

根据类创建多个实例 

my_dog = Dog('willie', 6)
your_dog = Dog('lucy', 3)
print("My dog's name is " + my_dog.name.title() + ".")
print("My dog is " + str(my_dog.age) + " years old.")#实例my_dog的打印语句
print("You dog's name is " + your_dog.name.title() + ".")#实例your_dog的打印语句
print("You dog is " + str(your_dog.age) + " years old.")

 属性

类中的每个属性都必须有初始值(可以是0和空字符)

class Dog():    

    def __init__(self, name, age):
        self.name = name
        self.age = age
        self.day = 0#属性day的默认值为0

  def update_a(self, new):
    '''修改属性值的方法'''
        self.day = new               
        '''禁止任何人把年龄往回调'''   
        #if new >= self.day :
           # self.day = new    
       #else :
            #print("返老还童?")
        '''对属性值进行递增'''
      #  self.day += new        
my_dog = Dog('willie',6) 
"""修改属性值"""
my_dog.day = 18#通过实例直接修改
my_dog.update_a(18)#通过方法修改


            

 继承

一个类继承另一个类时,它将自动获得另一个类的所有属性和方法。

创建子类时父类必须包含在当前文件中,且位于子类之前,

可使用 super() 将父类与子类关联起来

from car import Car

class ElectricCar(Car):#定义子类时必须在括号内指定父类名称

    def __init__(self, manufacturer, model, year):
        super().__init__(manufacturer, model, year)#让Pyton调用父类的方法__init__(),使ElecticCar包含父类的所有属性
     

my_tesla = ElectricCar('teska', 'models', 2016)#使用子类创建实例
print(my_tesla.get_descriptive_name())

 父类方法重写(覆盖)

在子类中定义一个与父类方法同名的方法,则Python将不会考虑父类中的这个方法,而只关注子类中定义的相应方法

将类作为属性的实例调用:

from car import Car

class Battery():

    def __init__(self, battery_size=60):
        self.battery_size = battery_size

    def describe_battery(self):
        print("This car has a " + str(self.battery_size) + "-kWh battery.")  
        
    def get_range(self):
        if self.battery_size == 60:
            range = 140
        elif self.battery_size == 85:
            range = 185   
        message = "This car can go approximately " + str(range)
        message += " miles on a full charge."
        print(message)
        
class ElectricCar(Car):

    def __init__(self, manufacturer, model, year):
        super().__init__(manufacturer, model, year)
        self.battery = Battery()#将类用作属性

my_tesla = ElectricCar('teska', 'models', 2016)
my_tesla.battery.describe_battery()#将类用作属性的实例调用

 

导入类模块

 

从一个模块中导入多个类 from car import Car, ElecticCar 

 

导入整个模块

因为要在类名前加上模块名所以不会发生覆盖,所以需要从一个模块导入很多类时,最好导入整个模块使用。

import car

my_car = car.Car('audi', 'a4', 2015)#使用car模块中的类创建实例,需要在类前加上模块名
print(my_car.get_descriptive_name())
my_car = car.ElectricCar('tesla', 'roadster', '2016')
print(my_car.get_descriptive_name)

 使用Python标准库collections创建有序字典

from collections import OrderedDict

favorite_languages = OrderedDict()#构建对象

favorite_languages['jen'] = 'python'#为对象填入元素
favorite_languages['sarah'] = 'c'
favorite_languages['edward'] = 'ruby'
favorite_languages['phil'] = 'python'

for name, language in favorite_languages.items():
    print(name.title() + "'s favorite language is " +
        language.title() + ".")
from random import randint#一个很有意思的库随机生成数字

class Die():
    '''一个会改变面的骰子'''
    def __init__(self, sides=6):
            '''控制面'''
        self.sides = sides#sides

    def roll_die(self):
             '''转骰子操作'''
        for a in range(0,10):#控制循环
            x = randint(1, self.sides)
            print(x)


a = Die()
a.roll_die()
b = Die()
b.sides = 10#改变骰子面数
b.roll_die()
    

 

 

工作流程:

开始时应该让代码结构尽可能简单,尽可能在在一个文件中完成所有工作,再将类移到独立的模块中。

每个模块应包含一段描述,对于其中的类能做什么也应有所描述

在类中使用一个空行来分隔方法;在模块中使用两个空格来分隔类

posted @ 2020-02-22 13:57  main(void)  阅读(192)  评论(0编辑  收藏