python 面向对象(二)成员

##################################总结###########################

类的成员:

  变量:

    实例变量      对象.属性=xxx

    类变量       共享给所有该类的对象 类.变量

  方法:

    实例方法,   对象.方法()     ###加了self的.调用的时候。必须用对象去访问. (重点)

      def method(self):

        pas

    类方法,一般都使用类名.方法() ###当方法需要传递类名的时候. 需要类方法. 

      @classmethod

      def method(cls):

    静态方法,写在类力的函数,一般使用类名.方法()  ###当你的方法不需要传递当前类的对象的时候。

      @staticmethod

      def method():

        pass

例子########

class Foo:

  def m1(self):

    pass

  @classmethod

  def m2(cls)

    pass

  @staticmethod

  def m3():

    pass

f=Foo()

f.m1()

Foo.m2()

Foo.m3()

属性:

  @property

  作用:把一个方法变成属性.

  有些属性必须经过计算而得到(比如出生算年纪)

  @property

  def age(self):

    run 2018-self.birth

print(p.age)#没加小括号

私有:

  __开头的东西就是私有的

   只有在自己类中使用

 

class Foo:
    name='aa'
    def __init__(self,name):
        self.name=name
    def m1(self):
        print('m1111')
    @classmethod
    def m2(cls):
        return cls.name
    @staticmethod
    def m3(a,b):
        return a+b
    @property
    def bin(self):
        return '这个是%s'%(self.name)
f=Foo('zaizai')
f.m1()#调用方法
cls=Foo.m2()
print(cls)#普通方法,若要在不用类名中 每次都要self.name
static=Foo.m3(1,2)
print(static)#当你的方法不需要传递当前类的对象的时候
print(f.bin)

 

class Person:
    def __init__(self):
        pass
    # 实例方法需要传递类的对象 self
    def think(self):
        print("人能思考")
    # 静态方法不需要传递对象或者类
    @staticmethod  # 静态方法
    def jisuan(a, b):
        print("我来过这里")
        return a + b
# 类方法: 第一个参数传递的是类名 @classmethod def clsMethod(cls): # cls表示的类 p = cls() # 可以动态的创建对象. print("我是一个类方法", p) p = Person()
p.think() #实例方法
# 静态方法的调用: c = Person.jisuan(1, 2) # 类名访问 print(c)

#类方法调用 Person.clsMethod()
# 类方法默认第一个参数接收的是类名
p.clsMethod() # 在调用类方法的时候. 默认的把类名传递给类方法 
#<bound method Person.he of <class '__main__.Person'>>
Person.clsMethod  # 推荐类名调用

结果:

我来过这里
3
我来过这里
8
我是一个类方法<class '__main__.Person'>

4.用方法来描述一个属性

 @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 = 26 # 不可以的, 因为age是一个方法. 不是一个变量

5.私有

只能在自己类中访问. 带有前置双下环线的内容

__方法
__变量
__类变量
都是私有. 比人访问不到. 包括他儿子.

class Person:
    __qie = "潘潘" # 类变量

    def __init__(self, name, mimi):
        self.name = name
        self.__mimi = mimi # 私有内容 实例变量

    def gaosu(self):
        print(f"把秘密告诉了太白, 第二天所有人都知道了{self.__mimi}")
        print(Person.__qie) # 私有的类变量只能在类中调用
        # return self.__mimi

    def __yue(self): # 私有的实例方法
        print("我要和宝宝约")

    @staticmethod
    def __koujiao():
        print("test希望和嫂子一起抠脚")

    @classmethod
    def __fangqi(cls):
        print("和嫂子一起放气")
p = Person("wusir", "和嫂子的故事")
# print(p.__mimi) # 私有的内容只能在类里面调用
p.gaosu()

# print(Person.__qie)
a = Person("wusir", "嫂子的故事")
# a.__yue()
# Person.__koujiao()

########结果###########

把秘密告诉了太白, 第二天所有人都知道了和嫂子的故事
潘潘

 

 

posted @ 2018-12-18 16:22  崽崽1573  阅读(196)  评论(0编辑  收藏  举报