python-14クラスのプロパティの読み書きメンバー関数の再ロード継承

3964 ワード

@propertyプロパティアクセラレータ


class Person:

    def __init__(self,name):
        self.__name = name

    @property
    def info(self):
        return self.__name

>>> p = Person("tom")
>>> print(p.info)
tom

                 
    !


読み書き属性
class Person:

    def __init__(self,name):
        self.__name = name

    @property
    def info(self):
        return self.__name
    @info.setter
    def info(self,val):
        self.__name = value

    @info.getter
    def info(self):
        return self.__name
    @info.deleter
    def info(self):
        del self.__name
        

p = Person("Bob") #      B,       
p.name = "Alice" #      A
print(p.info)


プロパティコンストラクタsetter getterの指定
class Person:

    def __init__(self,name):
        self.__name = name

    def getName(self):
        return self.__name
    def setName(self,value):
        self.__name = value
    def delName(self):
        del self.__name

    name = property(getName,setName,delName,"  name  ")


p = Person("Bob") 
print(p.name)


カスタムプロパティー
class C1:
    pass
    
o = C1();
o.name = "Alice"
print(o.name)

  :
Alice

======================================================
    :
class C1:
    pass

o = C1();
o.name = "Alice"
print(o.__dict__)

  :
{'name': 'Alice'}
         

        ,  Object     
    
__getattr__           #    
__getattribute__   #    

__setattr__  
__delattr__


インスタンスメソッド
def      (self,[    ])
class Person:
    def say_hi(self,name):
        self.name = name
        print("I am ",self.name )
    

o = Person();
o.say_hi("Alice")

  :
I am  Alice

      self

スタティツクメソッド
@staticmethod

def     ([    ]):

  self        self

class Person:
    @staticmethod
    def info(c):
        return c    

print(Person.info(3))

3

         

クラスメソッド
          ,         

@classmethod
def     (cls,[    ])

       cls     
     

class Foo:
    classname = "Foo"
    def __init__(self,name):
        self.name = name
    def f1(self):
        print(self.name)
    @staticmethod
    def f2():
        print("static")
    @classmethod
    def f3(cls):
        print(cls.classname)

f = Foo("zhong")
f.f1()
Foo.f2()
Foo.f3()

zhong
static
Foo

クラスのメソッド
class Methods:
    def publicMethod(self):
        print("    ")
    def __privateMethod(self):
        print("    ")
    def publicMethod2(self):
        self.__privateMethod()

m = Methods();
m.publicMethod()
m._Methods__privateMethod()

    
    

               

class Methods:
    def publicMethod(self):
        print("    ")
    def __privateMethod(self):
        print("    ")
    def publicMethod2(self):
        self.__privateMethod()

m = Methods();
Methods.publicMethod(m)

 #               
Methods._Methods__privateMethod(m)


メソッドの再ロード
     
1.   
class Person:
    def say_hi(self,name):
        print("hello I am " ,self.name)
    def say_hi(self,name,age):
        print("hello I am{0} age{1}",format(name,age))


2.       :
class Person:
    def say_hi(self,name):
        print("hello I am " ,self.name)
    def say_hi(self,name,age):
        print('hello I am {0}, age {1}'.format(name,age))

p = Person()
p.say_hi('Tom',23)
p.say_hi('Tom')

hello I am Tom, age 23
Traceback (most recent call last):
  File "D:/Program Files/Python36/test.py", line 9, in 
    p.say_hi('Tom')
TypeError: say_hi() missing 1 required positional argument: 'age'

                


継承
python          
java :extends
python  :
class    (   1,  2,  3,.........)
Eg:
class Person(object)