标签:splay 建模 静态方法 私有字段 address pen 属性 分享图片 编写
来来来看看今天都学了什么.
没错就是成员(黑帮成员).嵌套(建模),
1. 成员
1 . 类的成员
class Foo: # 方法 def __init__(self, name): # 实例变量/字段 self.name = name # 方法 def func(self): pass # obj,Foo类的对象 # obj,Foo类的实例 obj = Foo(‘你好啊‘)
成员呢,分为三类,
1 .变量
实例变量(字段)
公有实例变量(字段)
私有实例变量(字段)
类变量(静态字段)
公有类变量(静态字段)
私有类变量(静态字段)
实例一
class Foo: # 类变量(静态字段) country = "中国" def __init__(self, name): # 实例变量(字段) self.name = name def func(self): pass
准则:
实例变量(字段)访问时,使用对象访问,即: obj1.name
类变量(静态字段)访问时,使用类方法,即: Foo.country (实在不方便时,才使用对象)
什么时候用类变量?
当所有对象中有共同的字段时且要改都改要删都删时,可以将 实例变量(字段) 提取到 类变量(静态字段)
然后呢什么是私有实例变量(私有字段)看下面
class Foo: def __init__(self,name): # 私有实例变量(私有字段) self.__name = name self.age = 123 def func(self): print(self.__name) obj = Foo(‘略略略‘) print(obj.age) #obj.__name # 无法访问 obj.func() # 找一个内部人:func, 让func帮助你执行内部私有 __name
class Foo: country = "中国" def __init__(self): pass def func(self): # 内部调用 print(self.country) print(Foo.country) # 推荐 # 外部调用 print(Foo.country) obj = Foo() obj.func()
class Foo: __country = "中国" def __init__(self): pass def func(self): # 内部调用 print(self.__country) print(Foo.__country) # 推荐 # 外部无法调用私有类变量 # print(Foo.country) obj = Foo() obj.func()
思考题: 如何验证儿子都不知道私有字段的存在.
class Base(object): __secret = "受贿" class Foo(Base): def func(self): print(self.__secret) print(Foo.__secret) obj = Foo() obj.func()
class Base(object): __secret = "受贿" def zt(self): print(Base.__secret) class Foo(Base): def func(self): print(self.__secret) print(Foo.__secret) obj = Foo() obj.zt()
2方法
实例方法:必须用对象去调用 方法会用到类实例化对象,肯定要写成实例方法self.xxx=xxx
静态方法:可以直接用类调用 如果写了个类 对于对象一个都不用,根本没必要实例化直接写成Foo.display() @staticmethod还有默认的self不用带了
类方法:@classmethod
class Foo(object): def __init__(self, name): self.name = name def func(self): print(self.name) obj = Foo(‘史雷‘) obj.func()
class Foo(object): def __init__(self, name): elf.name = name # 静态方法,如果方法无需使用对象中封装的值,那么就可以使用静态方法 @staticmethod def display(a1,a2): return a1 + a2 Foo.display(1,3)
class Foo(object): # 类方法,cls是类 @classmethod def show(cls, x1, x2): print(cls, x1, x2) # 执行类方法 Foo.show(1, 8)
class Foo(object): def __init__(self): pass def __display(self,arg): print(‘私有方法‘,arg) def func(self): self.__display(123) obj = Foo() # obj.__display(123) # 无法访问 obj.func()
class Foo(object): def __init__(self): pass @staticmethod def __display(arg): print(‘私有静态 方法‘,arg) def func(self): Foo.__display(123) @staticmethod def get_display(): Foo.__display(888) # Foo.__display(123) 报错 obj = Foo() obj.func() Foo.get_display()
总结
1. 定义时:
- 方法上方写: @classmethod
- 方法的参数: 至少有一个cls参数
2. 执行时:
- 类名.方法名() # 默认会将当前类传到参数中.
3. 什么时用?
- 如果在方法中会使用到当前类,那么就可以使用类方法.
3 .属性(通过方法改造出来的)
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. 应用场景: 对于简单的方法,当无需传参且有返回值时,可以使用 @property
嵌套
创建三个学校且三个学校的设施内容等都是一致.
class School(object): def __init__(self, name, address): self.name = name self.address = address def speech(self): print(‘讲课‘) obj1 = School(‘老男孩北京校区‘, ‘美丽富饶的沙河‘) obj2 = School(‘老男孩上海校区‘, ‘浦东新区‘) obj3 = School(‘老男孩深圳校区‘, ‘南山区‘) class Teacher(object): def __init__(self, name, age, salary): self.name = name self.age = age self.__salary = salary self.school = None t1 = Teacher(‘李杰‘, 19, 188888) t2 = Teacher(‘艳涛‘, 18, 60) t3 = Teacher(‘女神‘,16, 900000) # ############## 老师分配校区 t1.school = obj1 t2.school = obj1 t3.school = obj2 # #################################### # 查看t1老师,所在的校区名称/地址 print(t1.school.name) print(t1.school.address) print(t1.name) print(t1.age) t1.school.speech()
标签:splay 建模 静态方法 私有字段 address pen 属性 分享图片 编写
原文地址:https://www.cnblogs.com/xihuanniya/p/9549010.html