def func(arg): # arg可以是多种类型,只要其中有send方法即可. arg.send()
代码示例:就是将相同的函数归类,然后构造对象进行调用
1 1. 构造方法 2 示例一: 3 class Foo: 4 5 def __init__(self,name): 构造方法,目的进行数据初始化. 6 self.name = name 7 self.age = 18 8 9 obj = Foo(‘侯明魏‘) 10 11 通过构造方法,可以将数据进行打包,以后使用时,去其中获取即可. 12 13 示例二: 14 class Bar: 15 pass 16 obj = Bar() 17 18 2. 应用 19 a. 将数据封装到对象中,以供自己在方法中调用 20 class FileHandler: 21 def __init__(self,file_path): 22 self.file_path = file_path 23 self.f = open(self.file_path, ‘rb‘) 24 25 def read_first(self): 26 # self.f.read() 27 # ... 28 pass 29 30 def read_last(self): 31 # self.f.read() 32 # ... 33 pass 34 35 def read_second(self): 36 # self.f... 37 # ... 38 pass 39 40 obj = FileHandler(‘C:/xx/xx.log‘) 41 obj.read_first() 42 obj.read_last() 43 obj.read_second() 44 obj.f.close() 45 46 b. 将数据封装到对象中,以供其他函数调用 47 def new_func(arg): 48 arg.k1 49 arg.k2 50 arg.k6 51 52 class Foo: 53 def __init__(self,k1,k2,k6): 54 self.k1 = k1 55 self.k2 = k2 56 self.k6 = k6 57 58 obj = Foo(111,22,333) 59 new_func(obj)
面向对象封装的规则:
继承支持多继承(先找左 / 在找右)
1 class SuperBase: 2 def f3(self): 3 print(‘f3‘) 4 5 class Base(SuperBase): # 父类,基类 6 def f2(self): 7 print(‘f2‘) 8 9 class Foo(Base): # 子类,派生类 10 11 def f1(self): 12 print(‘f1‘) 13 14 obj = Foo() 15 obj.f1() 16 obj.f2() 17 obj.f3() 18 # 原则:现在自己类中找,么有就去父类
多种形态或多种状态,可以称作鸭子模型
# 由于python原生支持多态,所以没有特殊性. """ class Foo1: def f1(self): pass class Foo2: def f1(self): pass class Foo3: def f1(self): pass def func(arg): arg.f1() obj = Foo1() # obj= Foo2() obj = Foo3() func(obj) """
self 参数是 Python 给我们自动传递。
执行方法时,前面必须有一个对象:xxx.func()
class Foo: def f1(self): pass def f2(self): self.f1() obj = Foo() obj.f2()
成员一共分为三类:
变量:
- 实例变量(字段)
- 公有实例变量(字段)
- 私有实例变量(字段)
class Base(object): def __init__(self,name): self.__name = name # 私有实例变量 self.age = 10 # 公有实例变量 def func(self): print(self.__name) obj = Base(‘张改熊‘) print(obj.name) # obj.__name # 无法访问 obj.func() # 找一个内部人:func,让 func 帮助你执行内部私有 __name
- 类变量(静态字段)
- 公有类变量(静态字段)
- 私有类变量(静态字段)
class Foo: __name = ‘ss‘ country = "中国" def __init__(self): pass def func(self); print(self.country) print(Foo.country) print(self.__name) print(Foo.__name) # 外部调用,但无法调用私有变量 print(Foo.country) obj = Foo() obj.func() # print(Foo.name)
方法:
- 实例方法
1 class Foo(object): 2 def __init__(self, name): 3 self.name = name 4 5 # 实例方法 6 def func(self): 7 print(self.name) 8 9 obj = Foo(‘..‘) 10 obj.func()
- 静态方法
class Foo(object): def __init__(self,name): self.name = name # 静态方法,如果方法无需使用对象中封装的值,那么就可以使用静态方法 @staticmethod def dispalay(a1,a2): return a1 + a2 Foo.display(1,3)
- 类方法
1 class Foo(object): 2 3 # 类方法,cls是类 4 @classmethod 5 def show(cls,x1,x2): 6 print(cls,x1,x2) 7 8 # 执行类方法 9 Foo.show(1,8)
属性(通过方法改造)
class Foo(object): def __init__(self): pass @property def start(self): return 1 @property def end(self): return 10 obj = Foo() print(obj.start) print(obj.end)
- 总结:
1.编写时,
- 方法上写 @property
- 方法参数:只有一个self
2.调用时,无须加括号、对象、方法
3.应用场景:对于简单的方法,当无绪传参且有返回值时,可以使用
原文:https://www.cnblogs.com/guogenyyy/p/11167152.html