一、成员
1.1变量
- 实例变量: 属于对象, 每个对象都各自封装自己的值, 只能通过对象调用
- 类变量: 属于类, 每个类中各自保存的数据, 可以通过对象和类进行调用
1.2方法
- 绑定方法: 默认有一个self参数, 由对象进行调用(此时self就等于调用放的这个对象)
- 类方法: 默认有一个cls参数, 用类或对象都可以调用(cls就等于调用方法的这个类)
- 静态方法: 无默认参数, 用类和对象都可以调用
1.3属性
基于方法+property装饰器实现可以实现,可以实现
obj.属性名
obj.属性名 = 123
del obj.属性名
语法和方法的对应关系。
二、成员修饰符
python成员修饰符就是: 公有, 私有
- 公有: 在任何地方都可以调用的这个成员
- 私有: 只有在类的内部才可以调用这个成员
示例:
class Foo(object):
def __init__(self, name, age):
self.__name = name
self.age = age
def get_data(self):
return self.__name
def get_age(self):
return self.age
obj = Foo("你打我呀", 123)
# 公有成员
print(obj.age)
v1 = obj.get_age()
print(v1)
# 私有成员
# print(obj.__name) # 错误,由于是私有成员,只能在类中进行使用。
v2 = obj.get_data()
print(v2)
按理说私有成员是无法被外部调用,但如果用一些特殊的语法也可以
示例:调用时加一个下划线:‘_’
class Foo(object):
def __init__(self):
self.__num = 123
self.age = 19
def __msg(self):
print(1234)
obj = Foo()
print(obj.age)
print(obj._Foo__num)
# 调用私有成员
obj._Foo__msg()
3.对象嵌套
在基于面向对象进行编程, 对象之前可以存着各种且套
例如: 组合, 关联, 依赖等
示例:
class Student(object):
""" 学生类 """
def __init__(self, name, age, class_object):
self.name = name
self.age = age
self.class_object = class_object
def message(self):
data = "我是一名{}班的学生,我叫:{},我今年{}岁".format(self.class_object.title, self.name, self.age)
print(data)
class Classes(object):
""" 班级类 """
def __init__(self, title):
self.title = title
c1 = Classes("Python全栈")
c2 = Classes("python人工智障")
user_object_list = [
Student("王大爷", 19, c1),
Student("你大爷", 19, c1),
Student("李大爷", 19, c2)
]
for obj in user_object_list:
print(obj.name,obj.age, obj.class_object.title)
四、特殊成员
在python中类中存着一些特殊的方法, 这些方法都是__方法名__格式, 这种方法在内部均有特殊函数
4.1 init: 初始化方法
class Foo:
def __init__(self, name):
self.name = name
obj = Foo('王大爷')
4.2 new: 构造方法
class Foo:
def __init__(self, name):
print('第二部: 初始化对象, 为空对象中创建数据')
self.name = name
def __new__(cls, *args, **kwargs):
print('第一步: 创建一个空对象')
return object.__new__(cls)
obj = Foo()
4.3 call : 函数方法, 实例化后以函数的方式执行
class Foo:
def __call__(self, *args, **kwargs):
print('执行call方法')
obj = Foo()
obj()
4.4__str__: 类说明方法
class Foo(object):
def __str__(self):
return "哈哈哈哈"
obj = Foo()
data = str(obj)
print(data)
4.5 dict : 类属性转字典方法
class Foo:
def __init__(self, name, age):
self.name = name
self.age = age
obj = Foo('李大爷', '21')
print(obj.__dict__)
4.6 getitem, setitem, delitem
class Foo(object):
def __getitem__(self, item):
pass
def __setitem__(self, key, value):
pass
def __delitem__(self, key):
pass
obj = Foo("王大爷", 19)
obj["x1"]
obj['x2'] = 123
del obj['x3']
4.7 enter, exit : 上下文管理用于前后事务处理
class Foo:
def __enter__(self):
print('我进来了啊')
return 666
def __exit__(self, exc_type, exc_val, exc_tb):
print('我出来了啊')
with Foo() as data:
print(data)
4.7 add: 对象+值, 内部会去执行, 对象.__add__方法, 后面的值当做参数传参过去
class Foo:
def __init__(self, name):
self.name = name
def __add__(self, other):
return '{}-{}'.format(self.name, other.name)
v1 = Foo('李大爷')
v2 = Foo('王大爷')
v3 = v1 + v2
print(v3)
4.8 iter: 迭代器
- 迭代器的定义:
1.当类中定义__iter__ 和 __next__两个方法
2.__iter__方法需要返回对象本身, 即: self
3.__next__方法返回下一个数据, 如果没有数据了, 则需要抛出一个StopIteration的异常
示例:
class Foo:
def __init__(self):
self.counter = 0
def __iter__(self):
return self
def __next__(self):
self.counter += 1
if self.counter == 3:
raise StopIteration()
return self.counter
obj1 = Foo()
v1 = next(obj1)
print(v1)
v2 = next(obj1)
print(v2)
v3 = next(obj1)
obj2 = Foo()
for item in obj2:
print('item')
4.9 生成器
# 创建生成器
def func():
yield 1
yield 2
# 创建一个生成器对象(内部是根据生成器类generator创建对象), 生成器类的内部也声明了: __iter__ , __ncet__方法
obj = func()
v1 = next(obj)
print(v1)
v2 = next(obj)
print(v2)
v3 = next(obj)
obj2 = func()
for item in obj2:
print(item) # 生成器类也是一种特殊的迭代器类
4.10 可迭代对象
如果一个勒种有一个__iter__方法切返回一个迭代器对象, 则我们以这个类创建的对象为可迭代对象
class Foo:
def __iter__(self):
return 迭代器对象或生成器对象
obj = Foo()
# 可迭代对象是可以使用for来进行循环,在循环的内部其实是先执行__iter__方法
# 获取起迭代器对象, 然后旁边在内部执行这个迭代器对象的next功能, 逐步取值
for item in obj:
pass
示例:
class IterRange:
def __init__(self, num):
self.num = num
self.counter = 1
def __iter__(self):
return self
def __next__(self):
self.counter += 1
if self.counter == self.num:
raise StopIteration()
return self.counter
class Xrange:
def __init__(self, max_num):
self.max_num = max_num
def __iter__(self):
return IterRange(self.max_num)
obj = Xrange(100)
for item in obj:
print(item)
- 可迭代的数据类型
字符串, 列表, 元祖, 字典, 集合
- 不可迭代数据类型
布尔值, 数据 整形, 浮点型