• 巨蟒python全栈开发-第17天 核能来袭-成员


    一.今日主要内容
        1.成员
    在类中你能写的所有内容都是类的成员
    2.变量
    (1)实例变量:昨天写的就是实例变量,由对象去访问的变量.
    (2)类变量(静态变量):此时,这个变量属于类,但是对象也可以访问

    3.方法
    (1)实例方法:昨天写的就是实例方法,使用 对象.方法() 进行调用
    特点:在声明的时候,需要给出self,self必须放在第一个位置
    在调用的时候,自动的会把对象传递给形参的self

    (2)类方法(@classmethod):类方法是属于类的.
    特点:在声明的时候需要给出一个能够接收类名的参数,cls,也必须放在参数的第一个
    在调用的时候,自动的把xx对象的类传递给cls

    (3) 静态方法(@staticmethod):静态方法也是属于类的,静态方法就好比,我们在类中定义了一个函数
    静态方法一般和类方法差不多,使用类名去访问

    4.属性(这个是比较有用的)
    #为了在难受的时候舒服一点
    在方法上添加一个@property,可以把一个方法变成一个属性,但是这个属性不可以被赋值
    当我们某一个属性必须经过计算才能得到结果的时候
    #我的理解:本质是方法,但是可以当成属性来用
    5.私有
    所有已双下划綫开头的方法,变量都是私有内容,外界无法访问//除非你主动暴露这些内容
    你想保护就把他私有化
    #总结:强化面向对象(今天量稍微大一些)

    二.今日内容大纲
    1.实例化变量
    2.实例方法
    3.类变量
    4.类方法
    5.静态方法
    6.属性
    7.私有

    三.今日内容详解
    1.实例变量
    class Person:
        def __init__(self,name,id,gender,birth):
            self.name=name      #实例变量   对象里的变量
            self.id=id
            self.gender=gender
            self.birth=birth
    
    p=Person('wusir','10086','不详','1900-12-15')
    
    
    print(p.birth)
    p.birth='1840-5-6'      #实例变量可以进行修改
    print(p.birth)
    
    #实例变量一般使用       对象.属性
    
    print(p.name)
    2.实例方法
    (1)
    class Computer(object):
        #实例方法
        def play(self):
            print('电脑可以扫雷')
    
            #在定义实例方法的时候,必须给出一个参数 self
            #形参的第一个参数,自动的把对象给传递进来
        def work(self):     #self 就是个形参,随便写,中文也行
            print(self)     #self 是当前类的对象
            print('电脑用来工作')
    
    c=Computer()
    c.work()            #调用的时候不需要手动给出self
    print(c)

    (2)

    回顾之前
    字符串操作. 列表操作. 字典操作. 元组操作.....
    s = "你好啊"
    s.replace("你", "我")
    之前讲解的所有方法都是实例方法

    3.类变量
    class Person:
        # country='中国'        #类变量,  类变量是属于类的
        country = '大清'          #类变量不是特别特别常用
        def __init__(self,name,gender):
            self.name=name
            self.gender=gender
    
    p=Person('武sir','未知')
    print(p.name)   #实例变量
    print(p.gender)
    print(p.country)    #类变量可以给对象使用
    
    p2=Person('太白','两性')
    print(p2.gender)
    print(p2.country)
    
                        #大坑:没有修改类变量
    p.country='大清'  #没有修改类变量,只是在自己的实例化空间内创建了一个country
    p2.country='大明'
    print(p.country)    #类变量可以给对象使用
    print(p2.country)
    
    Person.country='大元'     #类变量最好是使用类名来访问
    print(p.country)
    print(p2.country)

     4.类方法

    class Person:
        #实例方法
        def chi(self):
            print('人会吃')
    
        @classmethod  #装饰器,此时这个方法是一个类方法,固定方法
        def he(cls):    #此时接收到的cls是类名
            print(cls)
            print('人会喝')
    #用对象访问
    p=Person()
    p.he()          #解释:在调用类方法的时候. 默认的把类名传递给类方法
                    #<class '__main__.Person'>
                    #人会喝
    print(Person)   #<class '__main__.Person'>
    
    # 类方法一般用类名去访问
    Person.he() # 类方法
    
    # Person.chi()      #这句话就会报错
    
    # 总结:带类的最好用类来访问

    5.静态方法

    class Person:
    
        @staticmethod   #静态方法
        def yue():
            print('SKT')
    
    #静态方法可以使用对象访问,
    # 也可以使用类名访问,
    # 但是一般推荐使用类名访问
    
    p=Person()
    p.yue()
    
    Person.yue()
    #知识点回顾:
    #fromkeys共用value,返回新字典,不是原来的字典

    6.属性

    (1)引子

    #怎么解决,每过一年都要加一年,把age 替换成 birth
    class Person:
        def __init__(self,name,gender,birth):
            self.name=name
            self.gender=gender
            self.birth=birth     #2000  2018
        #年龄这一项,本来就应该是算出来的,而不是直接存储的
    p1=Person('武sir','未知',2000)
    age=2018-p1.birth       #每个人都有年龄这个属性,但是又没办法存储
    print(age)

    (2)@property

    class Person:
        def __init__(self,name,gender,birth):
            self.name=name
            self.gender=gender
            self.birth=birth     #2000  2018
        #年龄这一项,本来就应该是算出来的,而不是直接存储的
        @property   #把一个方法更改成一个属性,每次拿属性的时候都会自动的去执行这个方法
                    #方法的返回值就是属性值
        def age(self):      #实例方法
            print('我是方法')
            return 2018-self.birth
    #注意:这里的属性是不能赋值的,方法不是变量
    p1=Person('武sir','未知',2000)
    print(p1.age)       #看着像一个变量一样使用,实际上这里是调用的一个方法
    print(p1.age)
    
    # p1.age=99          #不可以修改的,因为age是一个方法,不是一个变量
                        #这句话修改会报错

    7.私有     __

    class Person:
        __qie='潘潘'    #私有类变量(或者叫做私有静态变量)
        def __init__(self,name,mimi):
            self.name=name
            self.__mimi=mimi    #__mimi代表的是 私有内容  实例变量
        def gaosu(self):
            print(f'把秘密告诉了太白,第二天所有人都知道了"{self.__mimi}"')
            print(Person.__qie) #私有的类变量只能在类中调用,可以用类名调用
            print(self.__qie) #私有的类变量只能在类中调用,可以用对象名调用
    
        def __yue(self):    #私有的实例方法
            print('我要和宝宝约')
    
        @staticmethod
        def __koujiao():
            print('韩志远希望和嫂子一起抠脚')
    
    p=Person('wusir','和嫂子的故事')
    p.gaosu()
    
    # print(p.__mimi) #私有的内容只能在类里面调用,这里写会报错
    #除非主动暴露自己的秘密,否则,不会
    # print(Person.__qie)   #这句话也会报错
    # p.__koujiao()         #也会报错
    # Person.__koujiao()         #也会报错

    作业:

    1. 简述⾯面向对象三⼤大特性并⽤用示例例解释说明?【背写】 

    封装:对属性和方法的封装,以便随时调用

    继承:子类除了本身之外还可以使用父类的方法和属性

    多态:鸭子模型,同一个对象拥有多种形态

    2.⾯向对象中的变量分为哪几种?并用示例说明区别?【背写】

    (1)实例变量: 说白了,就是每个实例变量都应该拥有的变量,比如,人的名字,人的爱好
    每个人的个人信息都属于实例变量..给对象用的

    (2) 类变量(静态变量): 直接写在类中的变量就是类变量,需要用类名来访问,可以改变,多个对象共享的

    3.⾯向对象中方法有哪几种?并用示例说明区别?【背写】 

    1. 类方法         类名.方法   调用
    2. 实例方法 对象.方法 调用
    3. 静态方法 类名.方法 调用

    4.面向对象中的属性有什么?并⽤用示例例说明? 

    重点记忆(这个 没有理解好)

    (1)@property 把方法转换成属性
    (2)对象.属性(self.name)

    5.简述静态方法和类方法的区别? 

    记忆!!!
    静态方法: 不用传递参数,没有继承
    类方法: 需要传递参数,可以继承;访问类方法,默认传递的是类;

    6.⾯向对象的⽅法中哪个无需传参数? 

    记忆!!!

    静态方法

    7.面向对象中公有和私有成员,在编写和调用时有哪些不同? 

    记忆!!!

    编写,公有成员编写时,没有什么特别的要求,私有成员在成员名字前面需要加上__,双下划线,
    公有成员在内部和外部都可以调用,私有成员只能在内部使用

    网友:
    公有使用: __xx__ 两端使用__
    私有使用__xx 左端使用

    8.

    class Foo(object):
        a1=11
        a2=12
        def __init__(self):
            self.a1=1
    obj=Foo()
    print(obj.a1)
    print(obj.a2)
    
    
    结果:
    1
    12
    分析:应该先找__init__里面的实例变量信息,再找类变量信息

    9.

    class Foo(object):
        a1=11
    
        def __init__(self,num):
            # self.a2=num
            self.a2=1
    obj=Foo(999)
    print(obj.a2)
    print(obj.a1)
    
    print(Foo.a1)
    # print(Foo.a2)     #因为第四行里是用类调用初始化方法里的变量,自然调用不到
                    #报错原因是,类中没有属性a2
    
    
    结果:
    999
    11
    11
    第四行报错

    10.

    class Foo(object):
        a1=1
        __a2=2
        a2=2
    
        def __init__(self,num):
            self.num=num
            self.__salary=1000
            # self.salary=1000
        def get_data(self):
            print(self.num+self.a1)
    obj=Foo(666)
    print(obj.num)
    print(obj.a1)
    # print(obj.__salary)     #结果:Foo' object has no attribute '__salary'
    # print(obj.salary)         #自己测试结果:1000
    # print(obj.__a2)
    # print(obj.a2)             #自己测试结果:2
    print(Foo.a1)             #结果:1
    print(Foo.__a2)
    # print(Foo.a2)               #自己测试结果:2
    
    
    结果:
    666
    1
    找不到
    找不到
    1
    找不到

    11.

    # 没问题,但是做这样的题目一定要仔细
    class Foo(object):
        a1=1
        __a2=2
    
        def __init__(self,num):
            self.num=num
            self.__salary=1000
    
        def get_data(self):
            print(self.num+self.a1)
    
    obj1=Foo(666)
    obj2=Foo(999)
    print(obj1.num)     #666
    print(obj1.a1)      #1
    
    obj1.num=18
    obj1.a1=99
    
    print(obj1.num)     #18
    print(obj1.a1)      #99
    
    print(obj2.a1)                  #1
    print(obj2.num+Foo.a1)          #1000
    print(obj2.num+obj1.a1)         #1098

    12.

    #注意下面的四种玩法
    class Foo(object):
        hobby='大保健'
        def __init__(self,num):
            self.num=num
            self.__salary=1000
        def f1(self):
            print(Foo.hobby)
        @staticmethod
        # def f2(self):
        def f2():       #注意这个静态方法不能有self,有self不会调用
            print(Foo.hobby)
        @classmethod
        def f3(cls):
            print(cls.hobby)
        @property
        def f4(self):
            print(Foo.hobby)
            # print(self.hobby)
    f=Foo(200)
    f.f1()
    f.f2()
    f.f3()
    f.f4

    13.

    class Foo(object):
        @classmethod
        def f3(cls):
            print(cls)
    Foo.f3()            #结果:<class '__main__.Foo'>

    14.

    class Foo(object):
        @classmethod
        def f3(cls):
            print(cls)
    obj=Foo()
    obj.f3()            #结果:<class '__main__.Foo'>

    15.

    #我认为是一样的
    #结果是一样的,和我推测的一样
    
    class Foo(object):
        @classmethod
        def f3(cls):
            print(cls)
        def f2(self):
            self.f3()       #<class '__main__.Foo'>
            Foo.f3()        #<class '__main__.Foo'>
    obj=Foo()
    obj.f2()

    16.

    class Base(object):
        @classmethod
        def f3(cls):
            print(cls)
        def f1(self):
            print('base.f1')
            self.f3()           #子类中有的话,用子类的,没有则用父类的
    class Foo(Base):
        # def f3(self):
        #     print('123')
        def f2(self):
            print('foo.f2')
            self.f1()
    obj=Foo()
    obj.f2()
    
    #结果:
    foo.f2
    base.f1
    <class '__main__.Foo'>

    17.请编写一个私有的静态方法,并通过代码证明私有方法不能再外部方法但可以在内部访问。

    #注意,我们可以在内部通过,自己的类和未私有化的方法来调用私有化的静态方法
    class Person:
        __qie='潘潘'    #私有类变量
        def __init__(self,name,mimi):
            self.name=name
            self.__mimi=mimi    #__mimi代表的是 私有方法
                            #
        @staticmethod
        def __donggua(self):
        # def donggua(self):
            print('你好啊!')
        def gaosu(self):
            # __donggua()
            Person.__donggua(self)
            print(f'把秘密告诉了太白,第二天所有人都知道了"{self.__mimi}"')
    p=Person('wusir','和嫂子的故事')
    # print(p.__mimi) #私有的内容只能在类里面调用
    #除非主动暴露自己的秘密,否则,不会
    p.gaosu()





  • 相关阅读:
    C#面向对象编程基础-喜课堂笔记
    [爬虫]通过url获取连接地址中的数据
    第10季asp.net基础
    初学MVC
    学习MVC遇到的问题
    飞行棋小项目
    JAVAscript学习笔记
    iOS 清除xcode缓存和生成文件
    Access用OleDbParameter更新/插入数据
    SQLite动态库下载
  • 原文地址:https://www.cnblogs.com/studybrother/p/10135947.html
Copyright © 2020-2023  润新知