本文主要是介绍python 的与众不同 -- 进阶篇(二、对象/类),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
对象(Object)
- 对象是内存中存储数据的区域
- 对象中可以存储任意数据
- 对象由三部分组成
1.对象标识(id)
2.对象类型(type)
3.对象的值(value)
面向对象(oop)
-
python 是一门面向对象的编程语言
-
简单理解,所有操作都是通过对象来进行的
-
万事万物皆对象
-
通过class关键字创建类
class MyClass():pass
-
isinstance() 用来检查一个对象是否是一个对象的实例
cl1 = MyClass()result = isinstance(cl1,MyClass) # 打印True
类(class)
- 类也是一个对象
- 类就是一个用来创建对象的 对象
- 类是type类型的对象,定义类实际上就是定义一个type类型的对象
- 类中有属性和方法
- 类中属性和方法不在一个作用域
class MyClass():name = '张三'def say_hello(a):print(name,'你好!!')mc = MyClass(); # 执行以下语句报错,原因时类中say_hello方法使用name属性,'name' is not defined mc.say_hello();
- 方法调用时,第一个参数由解析器自动传递,所以定义方法时,至少要定义一个形参
# 第一个参数就是调用者本身,以下示例证明对象id是一样的 class MyClass():def test(a):print(id(a))cl1 = MyClass() print(id(cl1)) cl1.test()打印: 55504960 55504960
- 类方法被调用时,第一个参数由解析器自动传递,传递的是调用者本身
# 类中属性和方法不在一个作用域,在方法中使用属性需要使用调用者获取class MyClass():name = '张三'def say_hello(self):print(self.name,'你好!!')
类的特殊方法init
- 特殊方法都是以两个下划线开始并以两个下划线结尾的方法
def __init__(self):pass
- 特殊方法调用时间
init回在类实例化(对象创建)后立即执行 - 特殊方法的作用
init可以用来初始化属性等操作class MyClass():def __init__(self,name):self.name = namedef say_hello(self):print(self.name,'你好!!')# 创建对象实例时传入参数,由init接收 mc = MyClass('李四')mc.say_hello()
类属性
- 类属性是直接在类中定义的
- 类属性可以通过类或类的实例访问
- 类属性只能通过类对象修改,无法通过实例对象修改
# 创建测试类 class A(object):count = 0 # 获取类实例对象 a = A() # 当我使用类实例对象修改类属性的时候,实际上是没有修改类属性值的 a.count = 10 print(A.count) print(a.count) # 打印 # 0 # 10 # ***Repl Closed***# 当我使用类修改属性时 A.count = 100 print(A.count) print(a.count) # 打印 # 100 # 100 # ***Repl Closed***
实例属性
- 通过类实例对象添加的属性称之为 -> 实例属性
- 实例属性只能通过实例修改,无法通过类修改
a = A() a.count = 10 # count只是和A类中count同名,但不是一个变量,是a实例对象新添加的
- 我们分别打印看一下
print(id(A.count)) print(id(a.count)) # 打印 相同 # 2073618336 # 2073618336 # ***Repl Closed***# 添加实例属性 a.count = 10 print(id(A.count)) print(id(a.count))# 打印 不同 # 2073618336 # 2073618496 # ***Repl Closed***
类方法
- 类方法是在类中定义并使用@classmethod修饰的方法
- 类方法可以通过类或类的实例访问
- 类方法的第一个参数是class的缩写cls,会被自动传入,cls就是当前类对象
@classmethod def test(cls):pass
实例方法
- 在类中定义的方法并以self为第一个参数的方法称之为 -> 实例方法
- 实例方法可以通过类或类的实例访问
- 实例方法通过实例调用时自动传入self(实例本身),通过类调用时必须手动传入实例对象
a = A() a.test() A.test(A())
静态方法
- 静态方法是在类中定义并使用@staticmethod修饰的方法
- 静态方法不需要指定任何参数
- 静态方法可以通过类或类的实例访问
@staticmethod def test():print('----------')a = A() a.test() A.test()
- 静态方法一般是一些工具方法。
- 静态方法可以看成一个类中的函数
特殊方法
- 特殊方法都是使用双下滑线开头和结尾的
- 特殊方法不需要我们手动调用,在相应状态时自动执行
- new(cls) 对象被创建时调用
- inti(self) 初始化时调用
- del(self) 被删除(垃圾回收)时调用
- str(self) 打印对象时由此函数返回数据
# 特殊方法__str__相当于toString,多用在bean中打印属性 class A(object):def __str__(self):return '你好...'a = A() print(a)
- repr(self) 对当前只用repr()函数时调用
可能不是太懂,我们在命令行操作看一下就能看出来# 它的作用是指对象在‘交互模式’中直接输出的效果 class A(object):def __repr__(self):return '我是repr方法...'a = A() print(repr(a))
# 进入python后 >>> a = 'abc' # 使用print打印a >>> print(a) abc >>> # 直接打印a >>> a 'abc' # 我们发现使用print打印a是不带引号的,直接打印a是带引号的,这个就是交互模式
- 对象比较
- object.lt(self, other) 小于
- object.le(self, other) 小于等于
- object.eq(self, other) 等于
- object.ne(self, other) 不等于
- object.gt(self, other) 大于
- object.ge(self, other) 大于等于
class A(object):def __init__(self,age):self.age = age# 接收两个参数,self是左边对象,other是右边对象def __lt__(self, other):return self.age < other.agea1 = A(15) a2 = A(20) print(a1 < a2) print(a2 < a1)
- len(slef) 返回对象的长度
- bool(slef) 转换为布尔值
- 对象运算
- object.add(self, other)
- object.sub(self, other)
- object.mul(self, other)
- object.matmul(self, other)
- object.truediv(self, other)
- object.floordiv(self, other)
- object.mod(self, other)
- object.divmod(self, other)
- object.pow(self, other[, modulo])
- object.lshift(self, other)
- object.rshift(self, other)
- object.and(self, other)
- object.xor(self, other)
- object.or(self, other)
- 特殊方法有很多,我这里就不一一列举了,详情见 官网文档.
这篇关于python 的与众不同 -- 进阶篇(二、对象/类)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!