面向对象 成员和嵌套
Posted wqzn
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面向对象 成员和嵌套相关的知识,希望对你有一定的参考价值。
成员和嵌套(建模)
一、成员分为三类:
1.实例变量(字段)
公有和私有实例变量(字段)
2.类变量(静态字段)
公有和私有类变量(静态字段)
二、嵌套
1.公有实例变量(字段):
class Foo: def __init__(self,name): self.name=name self.age=123 def func(self): print(self.name) ojb=Foo(‘jjj‘) print(ojb.name) print(ojb.age) ojb.func() jjj 123 jjj
私有实例变量(字段):
class Foo: def __init__(self,name): self.__name=name self.age=123 def func(self): print(self.__name) obj=Foo("你是谁") print(obj.age) obj.func()
注意:当他私有化的时候,print(obj.__name),会报错,拿不到__name的值,只能借助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()#通过内部的func调用
中国 中国 中国
类变量(静态字段)的私有:
class foo: __country="中国" def __init__(self): pass def func(self): # print(self.__country) print(foo.__country)#一般使用这个 # print(foo.__country)#调用外部会报错,因为私有 obj=foo() obj.func()#通过内部的func调用
准则:实例变量(字段)访问时,使用对象访问:obj.name
类变量(静态字段)访问时,使用类方法foo.country(实在不方便时才会使用self.country)
知识点:什么时候要用变量呢?
当所有对象中有共同的字段且都要修改或者删除的时候,可以将实例变量(字段)提取到类变量(静态字段)
如何从继承中获取类变量私有中的内容呢?
class Base: __secret ="受贿" def zt(self): print(Base.__secret) class foo(Base): def func(self): print(self.__secret) print(foo.__secret) obj=foo() obj.zt() #若果没有zt函数,是不会获取到父级里的__secret的,在继承中要有表现的话才会获取到
实例方法的静态方法使用:
class foo(object): def __init__(self,name): self.name=name def func(self): print(self.name) @staticmethod#静态方法:如果方法无需使用对象中的值得话,就使用静态方法 def display(a,b): return a+b obj=foo("lll") obj.func() print(obj.display(1,9)) lll 10
静态方法的使用:
1.编写:
方法上面写@staticmethod
方法的参数可有可无
2.调用时:
类名.方法名或者对象.方法名
3.啥时候写静态方法:
不调用对象中封装的值得时候
实例方法的类方法使用:
class foo: def __init__(self,name): self.name=name def func(self): print(self.name) @staticmethod#静态方法 def disliay(a,b): return a+b @classmethod#类方法 def show(cls,c,d): print(cls,c,d) foo.show(1,9) <class ‘__main__.foo‘> 1 9
类方法的使用:
1.定义时:
方法上写@classmethod
方法的参数:至少有一个cls参数
2.执行的时候
类名.方法名()#默认会将当前类传到参数里
3.啥时候用?
如果在方法中会用到当前类,那么就使用类方法
私有的实例方法
class fool: def __init__(self): pass def __display(self,xxx): print("siyou ",xxx) def func(self): self.__display(123) obj=fool() obj.func() siyou 123
私有的静态方法
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() 私有静态 方法 123 私有静态 方法 888
属性
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
10
属性总结:
编写的时候,方法上写@property,方法参数只有一个self。
调用的时候无需加括号,对象.方法
应用场景:对于简单的方法,无需传参且没有返回值的时候,可以使用@property
练习题:翻页
2
普通版:
date_lst=[] for i in range(1,901): date_lst.append("alex_%s页" %i ) while 1: page=int(input("请输入你要查看的页码")) per_page_num=10 start=(page-1)*per_page_num end=page*per_page_num page_list=date_lst[start:end] for el in page_list: print(el) 面向对象版:
class Pagenation(object):
"""
处理分页相关的代码
"""
def __init__(self,data_list,page,per_page_num=10):
"""
初始化
:param data_list: 所有的数据
:param page: 当前要查看的页面
:param per_page_num: 每页默认要显示的数据行数
"""
self.data_list = data_list
self.page = page
self.per_page_num = per_page_num
@property
def start(self):
"""
计算索引的起始位置
:return:
"""
return (self.page-1) * self.per_page_num
@property
def end(self):
"""
计算索引的结束位置
:return:
"""
return self.page * self.per_page_num
def show(self):
result = self.data_list[self.start:self.end]
for row in result:
print(row)
data_list = []
for i in range(1, 901):
data_list.append(‘alex-%s‘ % i)
while True:
# 1. 要查看的页面
page = int(input(‘请输入要查看的页码:‘))
obj = Pagenation(data_list,page)
obj.show()
嵌套:
""" 创建三个学校且三个学校的设施内容等都是一致. """ 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(‘TT‘, 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()
以上是关于面向对象 成员和嵌套的主要内容,如果未能解决你的问题,请参考以下文章