类(class)是一种面向对象计算机编程语言的构造,是创建对象的蓝图,描述所创建的对象共同的属性和方法。
把研究的诸多对象抽象
1 类和对象的关系
人类与张三、李四
class NanRen: #class,定义关键词 单词首字母大写,多个单词多个大小,不用下划线
'''
这是对于人这个类的定义 #类的文档
'''
def __init__(self,name): #初始化方法(有的资料叫构造方法,不准确)双下划线,至少得有self一个参数
self.name = name
self.iq = 100
self.gender = 1 #1:male
self.age = 18
def huishuohua(self): #普通方法,self函数不可少
return "i am a boy"
zhangsan = NanRen('zhangsan') #类的实例化
print(zhangsan.name)
print(zhangsan.gender)
print(zhangsan.age)
shuohua = zhangsan.huishuohua()
print(shuohua)
zhangsan
1
18
i am a boy
例:编写程序,判断学生是否完成作业,如果完成,进行表扬,否则进行批评
class Student:
def __init__(self, name, grade, subject): #定义一个学生的姓名、年级、科目
self.name = name
self.grade = grade
self.subject = subject
def do_work(self, time):
if self.grade > 3 and time > 2: #如果年纪大于3并且做作业时间大于2返回真
return True
elif self.grade < 3 and time > 0.5:
return True
else:
return False
class Teacher: #定义一个老师
def __init__(self, name, subject):
self.name = name
self.subject =subject
def evaluate(self, result = True):
if result:
return "You are great."
else:
return "You should work hard"
stu_zhang = Student('zhang', 5, 'math') #实例化张同学,5年级数学
tea_wang = Teacher('wang', 'math') #实例化王老师,数学
teacher_said = tea_wang.evaluate(stu_zhang.do_work(1)) #评估张同学做一个小时作业的结果
print("Teacher {0} said : {1}, {2}".format(tea_wang.name, stu_zhang.name, teacher_said)) #format函数,加上哪个老师对哪个学生说话
stu_li = Student('li', 4, 'phsics')
tea_liao = Teacher('liao', 'phsics')
teacher_said1 = tea_liao.evaluate(stu_li.do_work(5))
print("Teacher {0} said : {1}, {2}".format(tea_liao.name, stu_li.name, teacher_said1))
Teacher wang said : zhang, You should work hard
Teacher liao said : li, You are great.
初始化方法会默认执行
class Foo:
def __init__(self):
print("i am in init")
self.x = 'python' #实例具有了x属性,x属性的值是'python'
f = Foo()
i am in init
dir(f) #
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'x'] #最尾端有x的这个方法
f.x #可以直接调用
'python'
对象和面向对象
对象:表示客观世界问题空间中的某个具体事物,又表示软件系统解空间中的基本元素。
面向对象程序设计:(object- oriented programming,oop):一种程序设计范型,也是一种程序开发的方法。
2 属性
2.1 理解类属性和实例属性
特点:1、类属性,又称为静态属性;2、只有通过类才能修改;3、实例也拥有类属性,但不能修改类属性。
class Foo:
lang = 'python'
lang #lang的作用域只在类里面
Traceback (most recent call last):
File "<input>", line 1, in <module>
NameError: name 'lang' is not defined
dir(Foo)
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'lang'] #对象都可以用dir
Foo.lang #引用Foo类的lang属性
f = Foo()
type(f)
<class '__main__.Foo'>
'python'
Foo.group = 'laoqi classroom' #给类增加属性,对象可以任意增加属性
dir(Foo)
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'group', 'lang']
给实例增加属性,类不会增加属性。但给类增加属性,实例也会增加属性。
例:类是工厂,生产的汽车是实例,你买了的车增加装饰物,生产线并不会增加装饰物。
类是静态属性:不因为实例的值的修改而改变自身属性,因此是静态属性
类属性只能通过类修改,不能通过实例修改