环境小硕的转行之路-27-面向对象的成员

今日内容

1.面向对象的成员
2.组合(类似于建立模型->多个类之间的相互嵌套)

成员

 成员:类的成员

class Foo:
    country = 'CN'#为类创建了一个变量又称'静态字段',可以在obj1和obj2里面找到
    def __init__(self,name):#对象变量(变量)/实例变量(本质上是个函数)
        self.name = name
    def func():#方法(函数)
        pass
obj1 = Foo('negu')
obj2 = Foo('negi')
'''
obj1和obj2实例化的时候不止创建了name还创建了类对象指针,obj1和obj2都指向Foo,调用方法的时候都去Foo里面寻找.
而实例变量是放在各自的对象里面各自持有这样是为了节省内存.
obj->Foo类的对象
obj->Foo类的实例
   '''

  

成员共分为三类:
第一类
变量:
 -实例变量(字段)
   -公有实例变量
  -私有实例变量
  -类变量(静态字段)
  -公有类变量
  -私有类变量#几乎不用,但要知道.

字段

class Foo:
    country = 'CN'  # 为类创建了一个变量又称'静态字段',可以在obj1和obj2里面找到

    def __init__(self, name):  # 对象变量(变量)/字段/实例变量(本质上是个函数)
        self.name = name

    def func():  # 方法(函数)
        pass


obj1 = Foo('negu')
obj2 = Foo('negi')

print(obj1.country)#CN obj1.country = 'US'会改自己内部的country,obj2.country还是CN.也可以在外部往类里面创建新变量.
print(obj2.country)#CN

#通过对象没法改类里面的值.
#准则:实例变量(字段),使用对象访问,即obj1.name
#     类变量(静态字段)访问时,使用类方法来进行访问,即Foo.country,实在不方便才使用对象.
#什么时候用类变量:当不同对象中有相同的值的时候才用类变量(要改都改,要删都删的时候).将实例变量提取到类变量中.

#易错点
'''
obj1.name = 'tom'
obj1.country = 'US'
print(obj1.name)#tom 
print(obj1.country)#US
'''

############## 私有实例变量(私有字段) ##############
class Foo:
    def __init__(self,name):
        self.__name = name#加两个下划线变成私有变量,在外部不可获取.在类里面定义的函数可以调用.称为私有的实例变量或者私有字段.
        self.age = '22'#在内部定义而在外部可以获取的叫公有变量.
    def print_func(self):
        print(self.__name)
    obj = Foo('negu')
    obj.print_func()
    print(obj.age)


############## 私有类变量(私有静态字段) ##############

class Foc:
    __country = 'cn'
    def __init__(self):
        pass
    def print_func(self):#内部调用
        print(self.__country)
        print(Foc.__country)
objFoc = Foc()
objFoc.print_func()#打印cn
#print(Foc.__country)#报错

############## 私有字段在父类和子类之间的调用############
class Base(object):#python里面定义类的时候自动继承object(用于开辟类的内存等等之类的操作)
    __secret = '受贿'
    def secret_paper(self):
        print(self.__secret)
class Son(Base):
    def print_function(self):
        print(self.__secret)#报错.无法执行
obj = Son()
# print(obj.__secret)#报错
# obj.print_function()#报错
obj.secret_paper()#不报错

  

第二类:
  方法:
  -方法/实例方法
   -静态方法
  -类方法

class Foo(object):
    def func(self): #func下面有波浪线,表示没必要,因为没有用到self
        print('实例方法')
obj = Foo()
obj.func()#实例方法
class Foo1:
    def __init__(self,name):
        self.name = 'gegege'
    def func(self):#里面用到self才有必要
        print(self.name)
obj1 = Foo1('negu')
obj1.func()#实例方法

############ 静态方法 ############
class Static:
    def __init__(self,name):
        self.name = name
    #实例方法
    def func(self):
        print(self.name)
    @staticmethod#固定搭配
    #静态方法,可以直接通过类调用,如果方法中无需使用对象中封装的值,就用静态方法.相当于在类中写函数
    def display():#可以传参也可以不传,和函数一样
        print('666')
objStatic = Static('negu')
Static.display()#通过类调用
objStatic.display()#通过对象调用

'''
总结:
    1.编写时:方法上方有个@staticmethod
        方法参数可有可无
    2.调用时:
        -类.方法名()
        -对象.方法名()
    3.什么时候写静态方法?
        -无需调用对象中封装的值

'''
#类方法,相当于静态方法的补充
class ClassMethod:
    @classmethod
    def show(cls,x1,x2):#cls这个参数在python的内部会帮你自动传递
        print(cls,x1,x2)
#获取当前类的时候才用类方法.获取当前对象则用实例方法,什么都不用用静态方法.
ClassMethod.show(1,8)
'''
总结:
    1.定义时
        -方法上写@classmethod
        -()至少有一个cls参数
    2.执行时:
        -类名.方法() 默认会将当前类传到参数中
    3.什么时候使用
        -如果在函数中使用当前类就使用类方法.

'''
'''

面试题:静态方法和实例方法的区别和作用?
        1.定义的时候:@@
        2.执行的时候:实例方法要先实例化,静态和类可以直接类名.方法调用
        3.应用场景:不会用到对象相关数据时用静态方法和类方法,如果代码用到当前类则用类方法,其它情况用静态方法.
'''
################ 私有的实例方法 ###############
class Foo:
    def __init__(self):
        pass
    def __display(self,arg):
        print('私有方法',arg)
    def real_display(self):
        self.__display('fuck')
obj = Foo()
# obj.__display()#报错
obj.real_display()#成功调用
############### 私有的静态方法 ############
class Foo1:
    def __init__(self):
        pass
    @staticmethod
    def __display():
        print('私有方法')
    def real_display(self):
        self.__display()
# Foo1.display #访问不到,通过实例方法或再写一个正常静态方法调用.

  

嵌套

'''
创建三个学校,学校的大部分内容和设施都是一致.

'''
    class Company:
        def __init__(self,name,address):
            self.name = name
            self.address =address
        def speech(self):
            pass
    Company1 = Company('滴滴公司','北京')
    Company2 = Company('腾讯公司','深圳')
    Company3 = Company('华为公司','深圳')
    class Teacher:
        def __init__(self,name,gender,address,salary):
            self.name = name
            self.gender = gender
            self.__salary = salary
            self.address =address
            self.company = None
    t1 = Teacher('negu','male','Fuzhou','188888')
    t2 = Teacher('negu older 10 years','male','ShenZheng','500000')
    t3 = Teacher('negu older 20 years','male','ShenZheng','750000')

    t1.company = Company1#在t1对象里面做了一个嵌套
    print(t1.company.address)#北京,对象和对象之间的嵌套关系
    准则:不仅字段,方法也要归类,为嵌套做准备.

  

练习题

要求

data_list = []
#数据太多,进行分页展示
for i in range(1,901)
    data_list.append('negu-%s'%i)
page = int(input('请输入要查看的页码:'))
#900条数据进行分页展示,默认每页十条,且用面向对象的方法编写。

  

————

    class PageDivision:
        def __init__(self,page,num_per_page=10):
            '''
            初始化一些参数
            :param page:当前页码
            :param num_per_page:每页显示的数据数
            '''
            self.page = int(page)
            self.num_per_page = int(num_per_page)
        @property#Python内置的@property装饰器就是负责把一个方法变成属性调用的
        def start_score(self):
            return (self.page-1)*self.num_per_page
        @property
        def end_score(self):
            return self.page * self.num_per_page
    data_list = []
    for i in range(1,301):
        data_list.append('negu-%s'%i)
    page = input('请输入要查看的页码')
    obj = PageDivision(page)
    page_data = data_list[obj.start_score:obj.end_score]
    for item in page_data:
        print(item)

  

猜你喜欢

转载自www.cnblogs.com/negu/p/11740821.html