python_5、面向对象相关:类和对象

面向对象最重要的概念就是类(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允许对实例变量绑定任何数据,也就是说,对于两个实例变量,
虽然它们都是同一个类的不同实例,但拥有的变量名称都可能不同:

"""

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容