2018年6月28日【Python学習ノート】

10085 ワード

一、属性の私有化
属性のアクセス権:公開、保護(pythonにはありません)、プライベート公開:クラスの外部で直接使用可能(デフォルトは公開)公開属性:属性名は普通の単語(2つの下線で始まる属性ではありません)
≪プライベート|Private|ldap≫:プライベート属性はクラスの内部でのみ直接使用できます.属性名には下線が2つあります(-)先頭、下線なし
  class Person:
    """  """
    def __init__(self, name='', age=0):
        # name       
        self.name = name
        # __age       
        self.__age = age

    def show(self):
        print(self.name)
        #              
        print(self.__age)

p1 = Person('  ')
print(p1.name)

#              
# print(p1.__age)     :AttributeError

#        
p1.show()

二、偽の私有属性
実際の開発では、宣言クラスのプロパティが正のプライベートプロパティ(下線を2つ追加)を使用することはめったにありません.
実際の属性に対する要求:1.ポイント構文で属性に容易に値を付与したり、その値を取得したりすることができます(プライベートではありません).属性に値を付与する場合は、付与された値を規範化する必要があり、直接属性に値を付与することはできません(直接の公開属性ではありません)
要件を満たす:偽のプライベート属性+getterとsetterを使用
手順:1.属性を宣言します.属性名に下線を付ける2.属性にgetterとsetterを追加して値の付与と取得を制限するプロセスa.getterを追加する:-->属性値の取得を制限する操作getterの役割:属性値を返す
@property
def         (self):
          
    return self.        

b.setterの追加:-->制限で取得した属性値に値を割り当てる
@        .setter
def         (self,   ):
          
    self.        =   

3.クラスの外部で下線を引かない属性で属性の値を取得するか、属性に値を付与する
class Person:
    def __init__(self, name='', age=0):
        #        ,      _       ,
        #           ,   getter setter   
        self._name = name
        self._age = age
    #  _name    getter
    @property
    def name(self):
        if len(self._name) == 0:
            return '   '
        return self._name
    #  _name    setter
    @name.setter
    def name(self, name1):
        #             
        if isinstance(name1, str):
            self._name = name1
        else:
            self._name = ''
    @property
    def age(self):
        if self._age > 18:
            return '   '
        return self._age
    @age.setter
    def age(self, age1):
        if isinstance(age1, int):
            self._age = age1
        else:
            self._age = 0
p1 = Person('  ', 10)
# print(p1._name)   #     ,       
#   
print(p1.name)  #   
print(p1.age)   # 10
#   
p1.name = '  '
print(p1.name)  #   
p1.age = 15
print(p1.age)   # 15

例2:getterとsetterの使用と関係
1.getterは一般的に追加します.setterは書かなくてもいいです.setterを追加する場合はgetterを追加する必要があります注意:付与に条件を追加する場合はsetterに条件を追加する必要があります
class Cat:
    """ """
    def __init__(self, name='', color=''):
        self._name = name
        self._color = color
    @property
    def name(self):
        if isinstance(self._name, str):
        return self._name
        else:
            return ''
cat1 = Cat('  ', 'yellow')
cat1._name = '  '  #   
# print(cat1._name)   #    

練習:学生クラスを書いて、名前、成績の2つの属性があって、成績が数字で、名前が文字列であることを要求します
class Student:
    """   """
    def __init__(self, name='', sex=0):
        self._name = name
        self._sex = sex
    #  getter   
    @property
    def name(self):
        #   1
        # if isinstance(self._name, str):
        #     return self._name
        # else:
        #     return ''

        #   2
        return str(self._name)

    @property
    def sex(self):
            return self._sex
    @sex.setter
    def sex(self, sex):
        if isinstance(sex, int) or isinstance(sex, float):
            self._sex = sex
        else:
            self._sex = 0
stu1 = Student('  ', 100)
stu1._name = 123
print(stu1.name)
stu1.sex = 'abc'
print(stu1.sex)

三、クラスフィールドとクラス方法
1.クラスフィールドはクラス属性です.クラスからクラスフィールドを取得するには、クラスに宣言された関数の外の変数です.
2.クラスメソッド:クラスを呼び出して開発中に宣言メソッドがオブジェクトメソッドかクラスメソッドかをどのように決定するか:実装機能がオブジェクト属性でサポートされる必要があるかどうかを見て、必要であればオブジェクトメソッドとして宣言する必要がある
class Person:
    """  """
    #   person_num       
    person_num = 0

    #  @classmethod              
    #               cls,         ,
    #               (      )
    @classmethod   # -->     
    def hurt_earth(cls):
        print(cls)
        print('      ', Person.person_num, cls.person_num)
        #     Person.person_num, cls.person_num   

#          
print(Person.person_num)

Person.hurt_earth()  #           0 0
print(Person)   # 

数学のクラスを書いて、データのプラス/マイナス/乗算/除算の機能を提供します
class Math:
    @classmethod
    def add(cls, *num):
        sum1 = 0
        for x in num:
            sum1 += x
        return sum1

sum2 = Math.add(10, 2, 3)
print(sum2)

四、静的関数
静的関数静的関数:クラスで宣言され、クラスによって呼び出されるメソッド
例1:静的メソッド
class Math:
    """   """
    # multiply        
   @staticmethod
    def multiply(num1, num2):
        return num1 * num2

#             
sum1 = Math.multiply(10, 2)
print(sum1)

例2:静的メソッドとクラスメソッドの区別静的メソッドとクラスメソッドはいずれもクラスによって呼び出される
違い:1.クラスメソッドには、デフォルトパラメータclsが呼び出しメソッドを指すクラスがありますが、静的メソッドには2.タイプが異なり、静的メソッドのタイプはfunctionであり、クラスメソッドのタイプはmethodである.
class Download:
    """   """

    @staticmethod
    def download_image(image_file):
        print('  %s    ' % (image_file))

    @classmethod
    def download_movie(cls, movie_file):
        print('    :%s' % (movie_file))

    #                (        ),     
    def download(num):
        print('aaa', num)
Download.download_image('aa/123.png')  #   aa/123.png    
print(Download.download_image)   # 

Download.download_movie('aa/abc.mp4')   #     :aa/abc.mp4
print(Download.download_movie)   # >

print(Download.__dict__)

Download.download(100)   # aaa 100
print(Download.download)   # 

五、類の継承
継承:子クラスに親クラスの属性とメソッドを持たせる子クラス:継承者親クラス(スーパークラス):継承者
継承はいつ使用しますか:1つのクラスを書く時、このクラスの中の一部の属性と方法の別のクラスがすべて持っていることを発見して、この時これらの属性と方法を宣言する必要はなくて、直接別のクラスから継承して下ります
例1:継承方法
class   (  ):
        
class Person:
    """  """
    def __init__(self, name='aaa', age=0):
        self.name = name
        self.age = age

class Student(Person):
    pass

stu1 = Student()
print(stu1.name)

例2:どのようなものを受け継ぐことができるか.公開された属性は2を継承することができる.プライベート属性は継承できません3.公開の対象方法は継承できるが,私有はだめだ.クラスのフィールドは5を継承できます.クラスのメソッドも静的メソッドも可能
まとめ:属性とメソッドはプライベート以外は継承できます
class Animal:
    # 1.     
    def __init__(self, name='abc'):
        self.name = name
        self.__age = 18

    def run(self):
        print(self.__age)
    # 2.    
    def eat(self):
        print('   ')

    #        ,        
    def __shout(self):
        print(' ')
    # 3.   
    count = 100
    # 4.   
    @classmethod
    def class_func(cls):
        print('class_func')
    # 5.    
    @staticmethod
    def static_func():
        print('static_func')
class Dog(Animal):
    pass
dog1 = Dog()
print(dog1.name)
dog1.eat()
print(Dog.count)
Dog.class_func()
Dog.static_func()

六、クラスの継承書き換え
クラスを宣言します.親クラスを宣言しない場合、このクラスはobjectというクラスobjectクラスからデフォルトで継承されます.pythonのすべてのクラスの直接または間接の親です.
例1:書き換え親から継承されたメソッドを再実装する方法とは-->書き換え
class Animal(object):
    def __init__(self, name=''):
        self.name = name

    def shout(self):
        print('%s  ' % (self.name))

    def be_beat(self):
        print(self.name, '  ')
        print('       ')
class Dog(Animal):

    #      shout  ,    Dog    shout         
    def shout(self):
        print('%s:   ' % (self.name))

    #      be_beat  ,          ,        
    def be_beat(self):
        # super()        
        super().be_beat()
        print('    ')
dog1 = Dog('  ')
dog1.shout()   #   :   
dog1.be_beat()

例2:initメソッドの継承と書き換え
class Person:
    """ """
    def __init__(self, name='', age=0):
        self.name = name
        self.age = age
class Student(Person):

    #   init     :
    # 1.             ,
    #    super().__init__()          ,         
    def __init__(self, name='', age=0, study_id=''):
        super().__init__(name, age)
        self.study_id = study_id
person = Person()
stu1 = Student('name1', 18, '001')
print(stu1.name)

练习:正方形のクラスを书いて、持つ方法:面积を求めて、周長、持つ属性は辺の长さが1つの長方形のクラスを书いて、持つ方法:面积、周長、持つ属性は长さと幅です
class Rectangle:
    """   """
    def __init__(self, length=0, width=0):
        self.length = length
        self.width = width

    def area(self):
        return self.length * self.width

    def perimeter(self):
        return (self.length + self.width) * 2
class Square(Rectangle):
    """   """
   def __init__(self, length=0, width=0):
        super().__init__(length, width)
        self._side = 0

    @property
    def side(self):
        return self._side

    @side.setter
    def side(self, side):
        self.width = side
        self.length = side
        self._side = side
s1 = Square()
s1.side = 10
print(s1.area())
print(s1.perimeter())