面向对象最重要的概念就是类(Class)和实例(Instance),必须牢记类是抽象的模板。
比如Student类,而实例是根据类创建出来的一个个具体的"对象",每个对象都拥有相同的方法,但各自的数据可能不同。
类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。
所谓的类,其实指的就是一个类别,即具有相同属性与行为的所有对象构成的一个整体。
相同类别的对象之间总会比不同类别的对象之间更加相似。
方法:类中定义的函数。
对象:就是类的实例。通过类定义的数据结构实例。对象包括两个成员:属性(类变量和实例变量)和方法(类方法和示例方法)。
对于对象而言,有属性和方法,属性,名词,存储数据,方法,动词,表示行为
class Student():
name = "huangbo"
def study():
pass
类和对象的关系:
类是对象的抽象,而对象是类的具体表现形式。
类是设计的蓝图(模板),而对象就是该蓝图设计出的具体产物。
类变量:类变量在所有实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。
直接通过类名来访问
局部变量:定义在方法中的变量,只作用于当前实例的类。
实例变量:在类的声明中,属性是用变量来表示的。这种变量就称为实例变量,
是在类声明的内部但是在类的其他成员方法之外声明的。
Student
name
age
score
在类中定义的变量是所有实例对象都有的。但是也会出现某个变量是某个实例所独有的。
数据成员:类变量或者实例变量用于处理类及其实例对象的相关的数据。
方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,
这个过程叫方法的覆盖(override),也称为方法的重写。
继承:即一个派生类(derived class)继承基类(base class)的字段和方法。
假如现在有一个类:People(name,age)
现在还有一个类:Student(name,age)
现在还有一个类:Teacher(name,age)
继承也允许把一个派生类的对象作为一个基类对象对待。
例如,有这样一个设计:一个Dog类型的对象派生自Animal类,这是模拟"是一个(is-a)"关系(例如:Dog是一个Animal)。
实例化:创建一个类的实例,类的具体对象。
定义一个类,继承自object类,object类是所有类的父类
pass关键字,只有一个作用:如果你要定义某个东西,但是现在还没想到到底该怎么写,
所以为了保证代码不报错,先在要实现代码的地方,写一个pass, 就证明此处未写完,但是Python解释器遇到的时候不会报错
class A(object):
age = 18 # 类属性
创建一个A类的对象a,创建对象使用类名+()的方式
a = A()
a1 = A()
给对象绑定一个name属性, name是一个实例属性
a.name = "huangbo"
print(a, A, a.name)
print(a.age, a1.age)
print("-------------------------------0-----------------------------------")
class Student(object):
xxx = "abc" # 类变量,所有实例对象都能访问的
注意:特殊方法"init"前后分别有两个下划线 第一个参数永远是self,表示创建的实例本身
因此,在init方法内部,就可以把各种属性绑定到self,因为self就指向创建的实例本身。
def __init__(self, name, score):
"""
:param name: 实例属性
:param score: 实例属性
"""
self.name = name
self.score = score
类的方法/行为/函数:普通函数对比有一点不同,就是第一个参数永远是self
除此之外,类中函数和普通函数没有什么区别,依然可以定义默认参数,可变参数,关键字参数和命名关键字参数
def print_score(self):
print('%s: %s' % (self.name, self.score))
def get_grade(self):
if self.score >= 90:
return 'A'
elif self.score >= 60:
return 'B'
else:
return 'C'
构建对象,在调用类名+()的形式构建对象的时候,会调用在类中定义的init方法执行。
所以如果有什么需要在类对象创建好之后做一些初始化操作的,都可以放置在init方法中
s = Student("huangbo", 99)
print(s.name, s.score)
s.print_score()
print(s.get_grade())
print("-------------------------------1-----------------------------------")
继承
class Student1(Student):
"""
父类所具有的属性,和方法,子类可以通过继承来获取
"""
def __init__(self, age):
self.age = age
s1 = Student1(18)
print(s1.xxx, s1.age)
s1.aaaaa = 123 # aaaaa 是实例属性
print(type(s1))
print(isinstance(s1, Student))
print(isinstance(s1, Student1))
"""
总结:
1、类是创建实例的模板,而实例则是一个一个具体的对象,各个实例拥有的数据都互相独立,互不影响;
2、方法就是与实例绑定的函数,和普通函数不同,方法可以直接访问实例的数据;
3、通过在实例上调用方法,我们就直接操作了对象内部的数据,但无需知道方法内部的实现细节。
4、和静态语言不同,Python允许对实例变量绑定任何数据,也就是说,对于两个实例变量,
虽然它们都是同一个类的不同实例,但拥有的变量名称都可能不同:
"""