1.类
1.1. 创建和使用类
注意:
python默认方法:_方法名_,创建新实例时,会自动运行此方法
在python默认方法中,要在其他形参的前面加入self。通过实参传递时,会自动传递self,所以我们不需要传递它。self是一个指向实例本身的引用。
定义其他方法时,可加入形参self访问属性
属性指能够被实例访问的变量
通常首字母大写:类;小写:实例
class Person():
def __init__(self, name, age):
self.name = name
self.age = age
def sayHello(self):
print("Hello, " + self.title() + " !")
1.2. 根据类创建实例
在默认方法中,不需要return语句,python会自动返回实例
使用句点表示法来访问实例的属性
class Person():
def __init__(self, name, age):
self.name = name
self.age = age
def sayHello(self):
print('Hello, ' + self.name.title() + ' !')
person1 = Person('tom', 25)
person1.sayHello()
print(person1.name.title() + " is " + str(person1.age) + " years old.")
# Hello, Tom !
# Tom is 25 years old.
person2 = Person('carl', 18)
person2.sayHello()
print(person2.name.title() + " is " + str(person2.age) + " years old.")
# Hello, Carl !
# Carl is 18 years old.
1.3. 使用类和实例
class Animal():
def __init__(self, type, age):
self.type = type
self.age = age
def describe(self):
des = self.type.title() + " is " + str(self.age) + " years old."
return des
animal1 = Animal('dog', 5)
print(animal1.describe())
# Dog is 5 years old.
1.3.1 给属性指定默认值
注意:可以不用包含为属性提供初值的形参
class Person():
def __init__(self, name, age):
self.name = name
self.age = age
self.need = 'eat'
def need_fun(self):
print(self.name.title() + " need to " + self.need + " !")
person1 = Person('tom', 18)
person1.need_fun()
# Tom need to eat !
1.3.2 修改属性的值
直接修改属性的值
class Person():
def __init__(self, name, age):
self.name = name
self.age = age
self.need = 'eat'
def need_fun(self):
print(self.name.title() + " need to " + self.need + " !")
person1 = Person('tom', 18)
person1.need = 'sleep'
person1.need_fun()
# Tom need to sleep !
通过方法修改属性的值
class Person():
def __init__(self, name, gender):
self.name = name
self.gender = gender
self.age = 0
def update_age(self, new_age):
if new_age > self.age:
self.age = new_age
else:
print("You can't update the age!")
def read_age(self):
print(self.name.title() + " is " + str(self.age) + " years old!")
person1 = Person('tom', 'male')
person1.update_age(12)
person1.read_age()
# Tom is 12 years old!
通过方法对属性的值进行递增
class Person():
def __init__(self, name, gender):
self.name = name
self.gender = gender
self.age = 0
def update_age(self, new_age):
if new_age > self.age:
self.age = new_age
else:
print("You can't update the age!")
def increment_age(self, increase):
if increase <= 0:
print("Error")
else:
self.age += increase
def read_age(self):
print(self.name.title() + " is " + str(self.age) + " years old!")
person1 = Person('tom', 'male')
person1.update_age(10)
person1.read_age()
person1.increment_age(14)
person1.read_age()
# Tom is 12 years old!
# Tom is 24 years old!
2. 继承
2.1. 子类的方法__init__()
注意:
创建子类时,父类必须包含在当前文件中,并且位于子类的前面
定义子类时,要在括号内指定父类的名称
函数super,可以将父类和子类关联起来,使用方法:super().__init__(属性1,属性2,...)
class Person():
def __init__(self, name, gender):
self.name = name
self.gender = gender
def des(self):
print(self.name.title() + " : " + self.gender)
class Student(Person):
def __init__(self, name, gender):
super().__init__(name, gender)
stu1 = Student('tom', 'male')
stu1.des()
# Tom : male
2.2. 给子类定义属性和方法
class Person():
def __init__(self, name, gender):
self.name = name
self.gender = gender
def des(self):
print(self.name.title() + " : " + self.gender)
class Student(Person):
def __init__(self, name, gender):
super().__init__(name, gender)
self.task = 'study'
def doing(self):
print(self.name.title() + " : " + self.task)
stu1 = Student('tom', 'male')
stu1.doing()
# Tom : study
2.3. 重写父类的方法
注意:将要重写的父类方法名,在子类中要同名
class Animal():
def __init__(self, type, name):
self.type = type
self.name = name
def task(self):
print(self.name.title())
class Dog(Animal):
def __init__(self, type, name):
super().__init__(type, name)
self.job = 'run'
def task(self):
print(self.name.title() + " is a " + self.type + ": " + self.job)
dog = Dog('dog', 'tom')
dog.task()
# Tom is a dog: run
2.4. 将实例用作属性
注意:将一部分内容放入新类中,然后再将这个新类的实例作为原实例的属性
class Person():
def __init__(self, name, age):
self.name = name
self.age = age
class Student(Person):
def __init__(self, name, age):
super().__init__(name, age)
self.task = Task()
class Task():
def __init__(self, task="study"):
self.task = task
def des(self):
print(self.task)
stu = Student('tom', 16)
print(stu.name + ": ")
stu.task.des()
# tom:
# study
3. 导入类
3.1. 导入单个类
person.py :
class Person():
def __init__(self, name, age):
self.name = name
self.age = age
def des(self):
print(self.name.title() + ":" + str(self.age))
user.py :
from person import Person
user = Person('tom', 19)
user.des()
# Tom:19
3.2. 在一个模块中存储多个类
person.py :
class Person():
def __init__(self, name, age):
self.name = name
self.age = age
def des(self):
print(self.name.title() + ":" + str(self.age))
class Student(Person):
def __init__(self, name, age):
super().__init__(name, age)
self.job = "study"
self.study = Study()
class Study():
def __init__(self, course="English"):
self.course = course
def study_fun(self):
print("learn " + self.course)
user.py :
from person import Student
stu = Student("tom", 20)
stu.des()
print(stu.job)
stu.study.study_fun()
# Tom:20
# study
# learn English
3.3. 从一个模块中导入多个类
person.py :
class Person():
def __init__(self, name, age):
self.name = name
self.age = age
def des(self):
print(self.name.title() + ":" + str(self.age))
class Student(Person):
def __init__(self, name, age):
super().__init__(name, age)
self.job = "study"
def des(self):
print(self.name.title() + ":" + self.job)
user.py :
from person import Person, Student
person = Person("tom", 18)
person.des()
stu = Student("jack", 20)
stu.des()
# Tom:18
# Jack:study
3.4. 导入整个模块
注意:模块名.类名
person.py :
class Person():
def __init__(self, name, age):
self.name = name
self.age = age
def des(self):
print(self.name.title() + ":" + str(self.age))
class Student(Person):
def __init__(self, name, age):
super().__init__(name, age)
self.job = "study"
def des(self):
print(self.name.title() + ":" + self.job)
user.py :
import person
user1 = person.Person("tom", 20)
user1.des()
user2 = person.Student("jack", 15)
user2.des()
# Tom:20
# Jack:study
3.5. 导入模块中的所有类
注意:
from 模块名 import *
不推荐这种方法,因为导入的类名可能会与文件中的类名重合
from person import *
user1 = Person("tom", 20)
user1.des()
user2 = Student("jack", 15)
user2.des()
# Tom:20
# Jack:study
3.6. 在一个模块中导入另一个模块
person.py :
class Person():
def __init__(self, name, age):
self.name = name
self.age = age
def des(self):
print(self.name.title() + ":" + str(self.age))
student.py :
from person import Person
class Student(Person):
def __init__(self, name, age):
super().__init__(name, age)
self.job = "study"
def des(self):
print(self.name.title() + ":" + self.job)
user.py :
from person import Person
from student import Student
user1 = Person("tom", 20)
user1.des()
user2 = Student("jack", 15)
user2.des()
# Tom:20
# Jack:study
4. Python标准库
注意:我们可以使用标准库中的任何函数和类
4.1. 使用模块collections中的一个类:OrderedDict,可以记录添加键-值对的顺序
from collections import OrderedDict
user = OrderedDict()
user['tom'] = 13
user['jack'] = 15
user['ann'] = 18
for name, age in user.items():
print(name.title() + ":" + str(age))
# Tom:13
# Jack:15
# Ann:18
4.2. 使用模块random中的randint函数
from random import randint
print(randint(1, 5)) # 2
4.2.1 掷骰子
from random import randint
class Die():
def roll_die(self, sides=6):
print(randint(1, sides))
p1 = Die()
p1.roll_die(10) # 9
5. 类编码风格
类名采用驼峰命名法,即类中每个单词首字母大写(大驼峰法)不适用下划线,模块名与实例名都采用小写的格式,在单词间加上下划线
每个类,都需要包含一个文档字符串,如:"""文档说明"""
同时导入标准库中模块与自己编写的模块时,先导入标准模块中所需的内容,再导入自己模块中的内容