class
5. __init__()方法:初始化创建好的对象,初始化指的是:“给实例属性赋值”
6. __new__()方法: 用于创建对象,但我们一般无需重定义该方法。
1. dir(obj)可以获得对象的所有属性、方法
2. obj.__dict__ 对象的属性字典
3. pass 空语句
pass 为空语句。就是表示什么都不做,只是作为一个占位符存在。当你写代码时,
遇到暂时不知道往方法或者类中加入什么时,可以先用 pass 占位,后期再补上。
4. isinstance(对象,类型) 判断“对象”是不是“指定类型”
类属性
实列属性
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 操作】 类属性的使用测试 2 class Student: 3 company = "SXT" #类属性 4 count = 0 #类属性 5 def __init__(self,name,score): 6 self.name = name #实例属性 7 self.score = score 8 Student.count = Student.count+1 9 def say_score(self): #实例方法 10 print("我的公司是:",Student.company) 11 print(self.name,'的分数是:',self.score) 12 s1 = Student('张三',80) #s1 是实例对象,自动调用__init__()方法 13 s1.say_score() 14 print('一共创建{0}个 Student 对象'.format(Student.count)) 15 执行结果: 16 我的公司是: SXT 17 张三 的分数是: 80 18 一共创建 1 个 Student 对象
类方法
静态方法
__del__
del p2
程序结束
这两种情况都会调用该类的-__del__方法
__call__
定义了__call__方法的对象,称为“可调用对象”,即该对象可以像函数一样被调用。
#测试__call__,可调用对象
class SalaryAccount:
'''工资计算类'''
def __call__(self, salary):
yearSalary = salary*12
daySalary = salary//30
hourSalary = daySalary//8
return
dict(monthSalary=salary,yearSalary=yearSalary,daySalary=daySalary
,hourSalary=hourSalary)
s = SalaryAccount()
print(s(5000)) #可以像调用函数一样调用对象的__call__方法
运行结果:
{'monthSalary': 5000, 'yearSalary': 60000, 'daySalary': 166, 'hourSalary': 20}
私有属性和私有方法(实现封装)
Python 对于类的成员没有严格的访问控制限制,这与其他面向对象语言有区别。关于私有
属性和私有方法,有如下要点:
1. 通常我们约定,两个下划线开头的属性是私有的(private)。其他为公共的(public)。
2. 类内部可以访问私有属性(方法)
3. 类外部不能直接访问私有属性(方法)
4. 类外部可以通过“_类名__私有属性(方法)名”访问私有属性(方法)
@property 装饰器
@property 可以将一个方法的调用方式变成“属性调用”。
属性和方法命名总结
· _xxx:保护成员,不能用“from module import * ”导入,只有类对象和子类对象能访
问这些成员。
· __xxx__:系统定义的特殊成员
· __xxx: 类中的私有成员,只有类对象自己能访问,子类对象也不能访问。(但,在类外
部可以通过“对象名. _类名__xxx”这种特殊方式访问。Python 不存在严格意义的私有成员)
注:再次强调,方法和属性都遵循上面的规则
object 根类
object 类是所有类的父类,因此所有的类都有 object 类的属性和方法。我们显然有必要深
入研究一下 object 类的结构。对于我们继续深入学习 Python 很有好处。
dir()查看对象属性
为了深入学习对象,我们先学习内置函数 dir(),他可以让我们方便的看到指定对象所有的
属性。
【测试】查看对象所有属性以及和 object 进行比对
执行结果:
['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__',
'__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__',
'__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__',
'
__str__', '__subclasshook__']
['__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__', 'age', 'name', 'say_age']
从上面我们可以发现这样几个要点:
1. Person 对象增加了六个属性:
__dict__ __module__ __weakref__ age name say_age
2. object 的所有属性,Person 类作为 object 的子类,显然包含了所有的属性。
3. 我们打印 age、name、say_age,发现 say_age 虽然是方法,实际上也是属性。只不过,
这个属性的类型是“method”而已。
age <class 'int'>
name <class 'str'>
say_age <class 'method'>
【注】关于 object 这些属性的详细学习,会在后面学习中逐个涉及。在此,无法一一展开。
重写__str__()方法
object 有一个__str__()方法,用于返回一个对于“对象的描述”,对应于内置函数 str()
经常用于 print()方法,帮助我们查看对象的信息。__str__()可以重写。
Python 支持多重继承 。。不建议使用。
super()获得父类定义
特殊属性
Python 对象中包含了很多双下划线开始和结束的属性,这些是特殊属性,有特殊用法。这
里我们列出常见的特殊属性:
#测试特殊属性
class A:
pass
class B:
pass
class C(B,A):
def __init__(self,nn):
self.nn = nn
def cc(self):
print("cc")
c = C(3)
print(dir(c))
print(c.__dict__)
print(c.__class__)
print(C.__bases__)
print(C.mro())
print(A.__subclasses__())
特殊方法 | 含义 |
obj.__dict__ | 对象的属性字典 |
obj.__class__ | 对象所属的类 |
class.__bases__ | 类的基类元组(多继承) |
class.__base__ | 类的基类 |
class.__mro__ | 类层次结构 |
class.__subclasses__() | 子类列表 |
运行结果:
['__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__', 'cc', 'nn']
{'nn': 3}
<class '__main__.C'>
(<class '__main__.B'>, <class '__main__.A'>)
[<class '__main__.C'>, <class '__main__.B'>, <class '__main__.A'>, <class 'object'>]
[<class '__main__.C'>]
组合,设计模式