zoukankan      html  css  js  c++  java
  • day20 Pyhton学习 面向对象-成员

    一.类的成员

    class 类名:
     # 方法
     def __init__(self, 参数1, 参数2....):
     # 属性变量
       self.属性1 = 参数1
       self.属性2 = 参数2
     ....
     # 方法
     def method(self):
       pass

    在上面的代码中__init__和method都属于类的成员方法,又称为实例方法.self.属性1 = 参数1,这个代码的含义是给对象设置属性信息,又被称为成员变量或者实例变量.

    二.类的成员-变量

      在类中变量分成两大类:

       1.实例变量/成员变量

       2.类变量

    class Person:
     # 类变量, 表示所有的该类的对象都共享这个变量.
         country = "中国"
    
        def __init__(self, name, num, birthday):
     # 实例变量(字段) 表示你创建的每⼀个⼈都有这三个变量
               self.name = name
               self.num = num
               self.birthday = birthday
    p1 = Person("alex", 18, "1840年06⽉01⽇")
    print(p1.name) # alex
    print(p1.country) #中国
    p2 = Person("wusir", 28, "1894年07⽉25⽇")
    print(p2.name) # wusir 
    print(p2.country) # 中国   
    p1 = Person("alex", 18, "1840年06⽉01⽇")
    p1.country = "大"
    print(p1.name)
    print(p1.country) # 大清
    p2 = Person("wusir", 28, "1894年07⽉25⽇")
    print(p2.name)
    print(p2.country) # 中国

    执行p1.country = "大清"的时候,并没有改变类中的country.而是添加了p1中的实例变量,这个实例变量只在p1中存在,在p2中不存在

    通过程序来记录当前类被创建了多少个对象.

    class Foo:
         count = 0
             def __init__(self):
                     Foo.count += 1
    print(Foo.count) # 0
    Foo()
    Foo()
    Foo()
    print(Foo.count) # 3

    好了. 来做个简单的总结:

      实例变量, 给对象用的.

      类变量, 多个对象共享的. 最好是用类名来访问. 这样更加规范.

     三.类的成员-方法

      1.成员方法(实例方法)

      2.静态方法

      3.类方法

    1.成员方法:

    class Computer:
    
     # 实例方法(成员方法)
             def play(self):
                 print("我的电脑可以玩儿")
    c = Computer()
    c.play() # 对象直接去调用实例方法

    2.静态方法:静态方法不需要我们给方法传递self. 也就是说. 当出现一个方法不需要使用到成员变量的时候. 就可以选择使用静态方法. 静态方法需要我们在方法上面添加一个@staticmethod

    @staticmethod
    def fare():
         print("我的电脑非常牛B, 可以煎鸡蛋")
    Computer.fare() # 类名可以直接访问的
    c.fare() # 对象也可以访问. 但最好不要这么干. 以便于区分静态方法和实例方法

    3.类方法. 类方法和静态方法差不多, 只不过类方法需要在参数列表中的第一个位置预留一个位置, 通常我们给第一个参数起名字叫cls. 类方法在被调用的时候也不需要传递实例对象. 但是. 系统会自动的把类传递给第一个参数. 类方法在编写的时候, 需要在类方法上面添加@classmethod

    class Computer:
         def play(self):
             print("我的电脑可以玩⼉")
         @staticmethod
         def fare():
             print("我的电脑⾮常⽜B, 可以煎鸡蛋")
         @classmethod
         def cal(cls, a, b):
             print(cls)
             return a+b
    print(Computer.cal(1, 2)) # 此时会自动的把类名传递给类方法的第一个参数                    

    四 类的成员-属性

    属性其实就是通过方法改造过来的一种变量的写法, 在方法上添加一个@property就可以 了

    class Person:
         def __init__(self):
             pass
         @property
         def age(self):
             return 1
    
    p = Person()
    age = p.age
    print(age)
    应用场景: 我们一般保存数据的时候, 不会保存一个人的年龄. 因为随着时间的推移. 每个人的年龄都时刻在改变着. 那如何保存更加完美呢? 很简单. 保存出生年月日. 然后用程序来计算,你当前的年龄. 实时的. 那这个时候就需要进行相应的计算了. 而计算属于一个功能. 当然要写方法里了. 但是对于年龄这个属性而言. 他应该是一个数值. 而不是动作. 所以python就提供了这样一种机制. 通过方法来描述一个属性.
     注意:
     1. 方法参数只能有一个self
     2. 方法上方要写@property
     3. 调用的时候, 我们不需要写括号. 直接当成属性变量来用就可以了.
     4. 这种套路只能取值. 不能设置值

    五.私有变量

    class Person:
         def __init__(self, laopo, mimi):
             self.__laopo = laopo # 私有的
             self.__mimi = mimi
    alex = Person("wusir", "他俩搞基")
    print(alex.__mimi) # 私有的. 谁都不能碰

    程序报错. 私有的内容是访问不到的. 但是, 这个访问不到是有一定的局限性的. 比如: 

    class Person:
        def __init__(self, laopo, mimi):
            self.__laopo = laopo # 私有的
            self.__mimi = mimi
        def gaosuni(self):
            print("大喇叭开始广播了")
            return self.__mimi # 私有的内容.在他自己的方法那里, 他可以任意的进行使用
    alex = Person("wusir", "他俩搞基")
    mimi = alex.gaosuni() # 通过一个非私有的方法, 访问到了他的秘密.
    print(mimi)

    私有方法:

    class Person:
        def __init__(self):
            pass
        def __yue(self):
            print("我要约会")
        def job(self):
            print("我要⼯作")
            # self.__yue()#在自己类中访问自己的其他方法. 哪怕是私有的. 也是自己在用
    p = Person()
    # Person.____yue()#报错
    # p.__yue() # 报错
    p.job()

    需要注意的是, 对于私有的内容而言. 子类是无法继承的. 

    class Fu:
         __qingfu = "情妇_⼩潘潘"
    class Zi(Fu):
         pass
    print(Zi.__qingfu) # 报错

    class 类名: # ⽅法 def __init__(self, 参数1, 参数2....): # 属性变量 self.属性1 = 参数1 self.属性2 = 参数2 .... # ⽅法 def method(self): pass

  • 相关阅读:
    How ASP.NET MVC Works?[持续更新中…]
    PortalBasic Web 应用开发框架
    .NET性能分析最佳实践之:如何找出使用过多内存的.NET代码(基础篇)
    js模块化开发js大项目代码组织和多人协作的解决之道
    PortalBasic Web 应用开发框架:应用篇(二) —— Action 使用
    细细品味Hadoop_Hadoop集群(第2期)_机器信息分布表
    msmvps.comblogs
    敏捷开发中编写故事应该符合的条件
    自己动手重新实现LINQ to Objects: 12 DefaultIfEmpty
    我的时间管理——充分利用WindowsPhone、Android等设备,实现真正的无压工作!
  • 原文地址:https://www.cnblogs.com/pythonz/p/9945736.html
Copyright © 2011-2022 走看看