18日目オブジェクト指向プログラミングの考え方オブジェクト指向文法オブジェクト指向カプセル化機能隠し属性

オブジェクト指向プログラミングとプロセス指向プログラミングの違い
プロセス指向プログラミング:複雑な問題の単純化、スケーラビリティの低下。
オブジェクト指向プログラミング:複雑な読み取りが高くなり、スケーラビリティが強力になります。

オブジェクト指向プログラミング
コアは、データと関数を保持するために使用されるコンテナーであるオブジェクトという単語です。
このアイデアに基づいてプログラムを作成することは、コンテナーを作成することです。

特別な構文
クラス
オブジェクト
属性ルックアップ

3つのオブジェクト指向の特性
カプセル化:分類と統合、関連するデータと関数のカプセル化。これは、強力なスケーラビリティの特性をよく反映しています。
継承
、多態性

インスタンス化
オブジェクトを生成するためにクラスを呼び出すプロセスはインスタンス化と呼ばれます。
クラスを呼び出すことはクラスのインスタンス化と呼ばれます。クラスを
呼び出した結果オブジェクトであり、このオブジェクトはクラスのインスタンスと呼ばれます。

オブジェクト指向プログラミングのアイデア

def tell_info(aaa):
    print("my name is %s, my age is %s,my gender is %s" % (student["name"], student["age"], student["gender"]))


student = {
    
    "name": "nana",
           "age": 18,
           "gender": "female",
           "tell_info": tell_info}    #学生对象,学生容器,self自己调自己的功能

student["tell_info"](student)

案例2:
类:用来存放相似数据,已经相似功能的容器,用来节省内存空间
def tell_info(aaa):
    print("my name is %s, my age is %s,my gender is %s" % (student["name"], student["age"], student["gender"]))

student = {
    
    
    "school": "清华大学",
    "name": "nana",
    "age": 18,
    "gender": "female",
    "tell_info": tell_info}  # 学生对象,学生容器,self自己调自己的功能

student["tell_info"](student)

student1 = {
    
    
    "school": "清华大学",
    "name": "dada",
    "age": 19,
    "gender": "male",
    "tell_info": tell_info}  # 学生对象,学生容器,self自己调自己的功能

student["tell_info"](student1)

クラスとオブジェクトの関係図クラスには、
データプロパティと関数プロパティの2つのプロパティがあります。

  1. クラスのデータ属性はすべてのオブジェクトで共有されます

  2. クラスの関数属性はオブジェクトにバインドされています
    ここに画像の説明を挿入
    。obj.nameは最初にobj自身の名前空間から名前を検索し、名前が見つからない場合はクラスに移動し、クラスが見つからない場合は名前を検索します。親クラスを探します...到着時に例外をスローします

クラスとオブジェクトの原則クラスに
何が起こるかを定義し
ます。クラスとオブジェクトは本質的に名前空間です。オブジェクトには辞書内の一意のタイプの要素が含まれます。クラスには同じタイプの要素が含まれます。
クラスと関数の定義と名前空間の違い関数の名前空間は、呼び出されたときにのみ生成されます。クラスが定義されている限り、コードが実行されて名前空間が生成されます。
クラス名:Camel case

クラスとオブジェクト
オブジェクトは、関連するデータと関数のコンテナ
ですクラスは、オブジェクトと同様のデータと関数のコンテナです。

class Student:
    school = "清华大学"

    def tell_info(student):
        print("my name is %s, my age is %s,my gender is %s" % (student["name"], student["age"], student["gender"]))

    print("=====")

# print(Student.__dict__)     #class就是在背后把Student的同类型元素做成了一个字典的模式,__dict__表示查看类里面的名称空间的元素

#调用类的底层逻辑
# 创造一个对象的字典格式,用来存放对象独有的数据
# 将对象与类建立好关联
obj1 = Student()
# print(obj1.__dict__)  #建了一个空字典
# obj1.name = "nana"  # obj1.__dict__["name"] = "nana"
# obj1.age = 18  # obj1.__dict__["age"] = 18
# obj1.gender = "female"  # obj1.__dict__["gender"] = "female"
#
obj2 = Student()
# obj2.name = "dada"  # obj2.__dict__["name"] = "dada"
# obj2.age = 19  # obj2.__dict__["age"] = 19
# obj2.gender = "male"  # obj2.__dict__["gender"] = "male"

# 把对象写成函数
def init(self, x, y, z):
    self.name = x
    self.age = y
    self.gender = z


init(obj1, "nana", 18, "female")
init(obj2, "dada", 19, "male")

print(obj1.__dict__)
print(obj2.__dict__)
print(Student.__dict__)

クラスを呼び出すプロセス

class Student:
    school = "清华大学"

    def __init__(self, x, y, z):         #Student.__init__(空对象,"nana", 18, "male")
        self.name = x      # 空对象.name="nana"
        self.age = y       # 空对象.age=18
        self.gender = z    # 空对象.gender="female"

    def tell_info(student):
        print("my name is %s, my age is %s,my gender is %s" % (student["name"], student["age"], student["gender"]))


调用类的过程
1.先创造一个空对象
2.自动触发类内的__init__函数的运行,将空对象当作第一个参数自动传入
3.返回一个初始化好的对象给obj1  #注意,obj1返回值是Student()的返回值,__init__规定不能有返回值
obj1 = Student("nana", 18, "female")  # 返回值obj1={
    
    "name"="nana","age"=18,"gender"="female"}
obj2 = Student("dada", 19, "male")

属性ルックアップ

对象.属性的查找顺序,优先从对象里面找,如果找不到会再从类里面找
# class Student:
#     school = "清华大学"
#
#     def __init__(self, x, y, z):
#         self.name = x
#         self.age = y
#         self.gender = z
#
#     def tell_info(student):
#         print("my name is %s, my age is %s,my gender is %s" % (student.gender, student.age, student.gender))
#
#
# obj1 = Student("nana", 18, "female")
# obj2 = Student("dada", 19, "male")
#
# Student.tell_info(obj1)
# Student.tell_info(obj2)

# print(obj1.name)  # obj1.__dict__["name"]
# print(obj1.school)

# 类.属性,从类自己的字典里面找,类内部传参,无法去全局名称空间里面找值,只能再类内部找,类内部找不到就报错
# print(Student.school)    # 显示类里面school的值
# print(Student.__init__)  # 函数Student.__init__的内存地址<function Student.__init__ at 0x030B9538>
# print(Student.tell_info)  # 函数tell_info的内存地址<function Student.tell_info at 0x015F9460>

# 类中的数据属性是直接共享给所有对象用的
# 如果类的数据属性变了,那就所有数据的属性都改变,如果对象的数据属性改变了,那么只在该数据只在该对象内部发生改变
# obj1.school = "xxx"
# print(Student.school)  # 清华大学
# print(obj2.school)  # 清华大学
# print(obj1.school)  # xxx


クラス内の関数属性クラス内の関数は直接呼び出すことができます。クラスが呼び出す場合は通常の関数です。関数の使用規則に従って使用できますが
、実際にはクラス内の関数オブジェクトによって使用されます。オブジェクトが呼び出された場合、それはバインディングメソッドであり、バインディングメソッドは最初のパラメータとして呼び出し元を渡します。

class Student:
    school = "清华大学"

    def __init__(self, x, y, z):
        self.name = x
        self.age = y
        self.gender = z

    def tell_info(student):
        print("my name is %s, my age is %s,my gender is %s" % (student.gender, student.age, student.gender))


obj1 = Student("nana", 18, "female")
obj2 = Student("dada", 19, "male")

Student.tell_info(obj1)
Student.tell_info(obj2)
print(obj1.tell_info)   #<bound method Student.tell_info of <__main__.Student object at 0x00EAE6D0>>
绑定方法的概念
类中定义的函数一般都至少需要一个参数的,该参数是往定义的函数里面自动传入对象的,这种绑定关系就是绑定方法
obj1.tell_info()    #tell_info()会将调用者当作第一个参数传入,如果函数中还有其他参数,那么继续传其他的参数
obj2.tell_info()


非表示属性の
先頭の属性の特徴__:
実際には非表示ではありませんが、変形されています。
この変換は、クラス定義段階と文法のスキャン時にのみ実行されます。その後、 __変形しません。
非表示にする必要があります。内部

class People:
#     __country = "China"  # 将一个属性加了__开头就代表把该属性隐藏了
    def __init__(self, name, age):
        self.__name = name  # {
    
    '_People__name': 'nana'}
        self.__age = age  # '_People__age': 18

    def __func(self):  # _People__func
        print("xx")

    def tell_name(self):
        print(self.__name)  # {
    
    '_People__name': 'nana'}
        # self["__name"]

obj1 = People("nana", 18)
obj1.tell_name()

print(People.__country)    #加了__显示没有该属性
print(People.__dict__)     #__country显示结果:'_People__country': 'China'
print(People._People__country)
print(obj1.__dict__)

obj1.__gender = "female"
print(obj1.__gender)  # 可以直接访问到,female
obj1.tell_name()  # 对外不对内

なぜ属性を非表示にしたいのですか

1.隐藏数据属性为了严格控制类外部访问者对属性的操作
class People:
    def __init__(self, name, age):
        self.__name = name  # _People__name
        self.__age = age  # _People__age

    def tell_info(self):				#通过改接口的方式让用户只能查看
        print(self.__name, self.__age)		

    def set_info(self, name, age):				#通过调用函数改接口的的方式控制用户对属性的更改     
        if type(name) is not str:
            print("名字必须是字符串")
            return
        if type(age) is not int:
            print("年龄必须是数字")
            return
        self.__name = name
        self.__age = age


obj1 = People("nana", 18)
# obj1.tell_info()         
obj1.set_info("NANA", 18)
obj1.tell_info()

2.隐藏函数(功能)属性为了隔离复杂度
class ATM:
    def __card(self):
        print("插卡")
    def __auth(self):
        print("用户认证")
    def __input(self):
        print("取出")

    def withdraw(self):
        self.__card()
        self.__auth()
        self.__input()

a = ATM()
a.withdraw()

おすすめ

転載: blog.csdn.net/Yosigo_/article/details/112383310