面向对象 成员和嵌套

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()

 



















































以上是关于面向对象 成员和嵌套的主要内容,如果未能解决你的问题,请参考以下文章

面向对象的成员与嵌套

使用嵌套片段和动画对象

面向对象--类,嵌套

《C++ Primer》之面向对象编程

java面向对象编程知识点总结

VSCode自定义代码片段——JS中的面向对象编程