day15 面向对象 成员

成员
1. 变量
   1.实例变量 
   格式:
   变量.xxx=xx (称为实例变量,也叫属性,字段)给对象用的
   2.类变量
   类变量:直接写在类中的变量就是类变量,类变量一般用类名来访问
          其实就是类中相同的属性提取出来
   总结:实例变量, 给对象用的的.
        类变量, 多个对象共享的. 最好是用类名来访问. 这样更加规范.
    例:
    class Person:
        cooutry="中国"
        def __init__(self,name,age):
            self.name=name
            self.age=age
    Person.country="大清"                #类变量只能通过类名来改变                
    p1=Person("小王",18)
    p1.country="大清"                    #尽管对象拥有country这个类变量,但是并不会修改类变量,
                                         #只是给p1赋值了一个实例变量
    print(p1.country)                    #大清
    print(Person.country)                #直接通过类名访问  大清
    
    p2=Person("小红",16)
    print(p2.country)                    #大清
2.方法
  1.实例方法 
   语法:
   对象.方法() 直接调用
   说白了就是对象直接调用的方法
  
  2.类方法  加前缀@classmethod
  例:class Person:
    def chi(self):
        print("好吃")
    @classmethod
    def he(cls):              参数第一个位置要预留,默认为(cls),
        print("")           而静态方法,不需要预留这个,这是他们的区别
    p1=Person()
    p1.he()      #不管是类还是对象访问类方法,默认传进去的是类
                  最好是用类名去访问    
                  
  3.静态方法  加前缀@staticmethod
    例:
    class Computer:
       def play(self):
         print("我的电脑可以玩")
       @staticmethod                       静态方法第一个参数位置不需要预留
       def fare() :                        可以用对象访问也可以用类名访问,最好用对象
         print("我的电脑好, 可以煎鸡蛋")   访问,以区分类方法和实例方法(相当于在类中定义一个普通函数)
       @classmethod
       def cal(cls, a, b):
         print(cls)
         return a+b
       print(Computer.cal(1, 2)) # 此时会自动的把类名传递给类方法的第1个参数
3.属性
  语法: 对象.属性
  class ren:
     def __init__(name ,birthday)
         self.name=name
         self.birthday=birthday
     @property                          #把方法转为属性
     def age(self)
        return 2018-self.birthday
     r=ren("小王",1995)
     age=r.age
     print(age)
     注:
     1.方法只能有一个参数self
     2.必须加前缀@property
     3.调用时候,不需要括号,直接当成属性来使用就行
     4.只能取值,不能赋值(需要有返回值)
4.私有
   1.私有变量  2.私有方法  (注,私有方法,子类是无法继承的)
   例:
   class Person:
    def __init__(self,name):
        self.__name=name         #私有变量
        print("这里是构造函数(方法)")
    def init(self):
        print("这里是实例方法")
        return self.__name
    def __chi(self):
        print("这里是私有方法")
    def __laopo(self):
        print("这是刘强东的老婆")
    def he(self):
        self.__laopo()
        print("让你看看怎么调用私有的,比如别人的老婆")
p=Person("小王")
print(p.__name)   #报错,访问不到  私有变量
p._chi()          #报错,访问不到 私有方法

name=p.init()
print(name)           #通过其他方法访问到私有变量

p.he()                #老婆是刘强东的,但是我把她报出来玩了(
                    # 可以把别人的老婆(私有的)带到自己的世界玩,)
                    #(在自己的世界,别人私有的想怎么玩就怎么玩)
#总结:私有变量不是绝对的,可以通过其他非私有方法访问
#     静态变量和类变量是一样的道理

 

例
关于私有方法的一种注意事项,引用自老师
#正常情况
>>> class A:
...     def fa(self):
...         print('from A')
...     def test(self):
...         self.fa()
... 
>>> class B(A):
...     def fa(self):
...         print('from B')
... 
>>> b=B()
>>> b.test()
from B
 

#把fa定义成私有的,即__fa
>>> class A:
...     def __fa(self): #在定义时就变形为_A__fa
...         print('from A')
...     def test(self):
...         self.__fa() #只会与自己所在的类为准,即调用_A__fa
... 
>>> class B(A):
...     def __fa(self):
...         print('from B')
... 
>>> b=B()
>>> b.test()
from A

 

posted @ 2018-11-07 20:19  阿布_alone  阅读(124)  评论(0编辑  收藏  举报
TOP