类是对一群具有相同 特征或者 行为的事物的一个统称,是抽象的,不能直接使用
1)特征 被称为 属性(变量)
2)行为 被称为 方法(函数)
Python 中,要 给对象设置属性,非常的容易,但是不推荐使用只需要在 类的外部的代码 中直接通过 . 设置一个属性即可
注意:这种方式虽然简单,但是不推荐使用!
tom.name = "Tom" ... lazy_cat.name = "大懒猫"
__del__ 方法(知道)在 Python 中
类名() 创建对象时,为对象 分配完空间后,自动 调用 __init__ 方法__del__ 方法应用场景
__init__ 改造初始化方法,可以让创建对象更加灵活__del__ 如果希望在对象被销毁前,再做一些事情,可以考虑一下 __del__ 方法生命周期
类名() 创建,生命周期开始__del__ 方法一旦被调用,生命周期结束class Cat:
    def __init__(self, new_name):
        self.name = new_name
        print("%s 来了" % self.name)
    def __del__(self):
        print("%s 去了" % self.name)
# tom 是一个全局变量
tom = Cat("Tom")
print(tom.name)
# del 关键字可以删除一个对象
del tom
print("-" * 50)
__str__ 方法Python 中,使用 print 输出 对象变量,默认情况下,会输出这个变量 引用的对象 是 由哪一个类创建的对象,以及 在内存中的地址(十六进制表示)print 输出 对象变量 时,能够打印 自定义的内容,就可以利用 __str__ 这个内置方法了注意:
__str__方法必须返回一个字符串
class Cat:
    def __init__(self, new_name):
        self.name = new_name
        print("%s 来了" % self.name)
    def __del__(self):
        print("%s 去了" % self.name)
    def __str__(self):
        return "我是小猫:%s" % self.name
tom = Cat("Tom")
print(tom)
身份运算符用于 比较 两个对象的 内存地址 是否一致 —— 是否是对同一个对象的引用
Python 中针对 None 比较时,建议使用 is 判断| 运算符 | 描述 | 实例 | 
|---|---|---|
| is | is 是判断两个标识符是不是引用同一个对象 | x is y,类似 id(x) == id(y) | 
| is not | is not 是判断两个标识符是不是引用不同对象 | x is not y,类似 id(a) != id(b) | 
is 用于判断 两个变量 引用对象是否为同一个 == 用于判断 引用变量的值 是否相等
>>> a = [1, 2, 3] >>> b = [1, 2, 3] >>> b is a False >>> b == a True
面向对象三大特性
Dog 类是 Animal 类的子类,Animal 类是 Dog 类的父类,Dog 类从 Animal 类继承Dog 类是 Animal 类的派生类,Animal 类是 Dog 类的基类,Dog 类从 Animal 类派生super().父类方法 来调用父类方法的执行superPython 中 super 是一个 特殊的类super() 就是使用 super 类创建出来的对象
- 私有属性、方法 是对象的隐私,不对外公开,外界 以及 子类 都不能直接访问
- 私有属性、方法 通常用于做一些内部的事情
问题的提出
提示:开发时,应该尽量避免这种容易产生混淆的情况! —— 如果 父类之间 存在 同名的属性或者方法,应该 尽量避免 使用多继承
Python 中针对 类 提供了一个 内置属性 __mro__ 可以查看 方法 搜索顺序method resolution order,主要用于 在多继承时判断 方法、属性 的调用 路径 print(C.__mro__)
输出结果
(<class ‘__main__.C‘>, <class ‘__main__.A‘>, <class ‘__main__.B‘>, <class ‘object‘>)
__mro__ 的输出结果 从左至右 的顺序查找的
object是Python为所有对象提供的 基类,提供有一些内置的属性和方法,可以使用dir函数查看
object 为基类的类,推荐使用经典类:不以 object 为基类的类,不推荐使用
在 Python 3.x 中定义类时,如果没有指定父类,会 默认使用 object 作为该类的 基类 —— Python 3.x 中定义的类都是 新式类
在 Python 2.x 中定义类时,如果没有指定父类,则不会以 object 作为 基类
新式类 和 经典类 在多继承时 —— 会影响到方法的搜索顺序
为了保证编写的代码能够同时在 Python 2.x 和 Python 3.x 运行!
今后在定义类时,如果没有父类,建议统一继承自 object
class 类名(object):
    pass
创建类的实例之后,内存中会开辟一块空间,保存的是这个实例对象还有实例属性,实例方法却是引用类里面的实例方法。
要访问类属性有两种方式:
注意,如果使用 对象.类属性 = 值 赋值语句,只会 给对象添加一个属性,而不会影响到 类属性的值
class 关键字下方可以定义 类属性语法如下
@classmethod
def 类方法名(cls):
    pass
@classmethod 来标识,告诉解释器这是一个类方法cls
cls 就是 哪一个类的引用self 类似clscls 参数cls. 访问类的属性cls. 调用其他的类方法在开发时,如果需要在 类 中封装一个方法,这个方法:
这个时候,可以把这个方法封装成一个 静态方法
语法如下
@staticmethod
def 静态方法名():
    pass
通过 类名. 调用 静态方法
提问
如果方法内部 即需要访问 实例属性,又需要访问 类属性,应该定义成什么方法?
答案
  
原文:https://www.cnblogs.com/linyuhong/p/10037960.html