1. 객체 지향
클래스(class): 동일한 속성과 메소드를 설명하는 데 사용되는 객체의 모음입니다.
클래스 변수: 클래스 변수는 인스턴스화된 객체 전체에서 공개됩니다. 일반적으로 클래스 내부와 함수 본문 외부에 정의됩니다.
메서드: 클래스의 함수
데이터 멤버: 클래스 변수 또는 인스턴스 변수는 클래스 및 해당 인스턴스 개체와 관련된 데이터를 처리하는 데 사용됩니다.
메서드 재작성: 상위 클래스에서 상속된 메소드가 하위 클래스의 요구 사항을 충족할 수 없는 경우 이를 재작성할 수 있습니다. 이 프로세스를 메소드 재작성이라고도 합니다.
로컬 변수: 메서드에 정의된 변수는 현재 인스턴스의 클래스에만 작용합니다.
인스턴스 변수: 클래스 선언에서 속성은 변수로 표현됩니다. 이러한 변수를 인스턴스 변수라고 합니다.
상속: 파생 클래스는 기본 클래스의 필드와 메서드를 상속합니다. 상속을 사용하면 파생 클래스의 개체를 기본 클래스 개체로 처리할 수도 있습니다. 과일 클래스를 정의한 다음 파생 클래스 apple을 정의하는 것과 같습니다. 이 클래스는 과일 클래스의 일부 속성과 메서드를 가지며, 과일 클래스와 유사한 고유한 속성과 메서드도 일부 갖습니다. 'is-a' 관계.
인스턴스화: 클래스의 특정 객체입니다. 클래스는 객체로 인스턴스화한 후에만 해당 작업을 수행할 수 있습니다.
Object: 클래스를 통해 정의된 데이터 구조의 인스턴스입니다. 개체에는 두 개의 데이터 멤버(클래스 변수 및 인스턴스 변수)와 메서드가 포함됩니다.
2. 클래스 정의
클래스 정의:
class ClassName:.... .... ....
클래스 이름에 카멜 표기법을 사용하거나 모두 대문자를 사용하는 것이 좋습니다
3 클래스 객체 메서드를 사용하세요. 두 가지 작업: 속성 참조 및 인스턴스화
속성 참조: Python의 다른 구문과 마찬가지로 obj.name클래스에 __이 있는 속성은 __name처럼 클래스 외부에서 직접 액세스할 수 없습니다.class Fruit:#这是类的一个基本属性self.number = 100def get_number(self): a = self.number + 100return a f = Fruit()print('We have {0} fruits'.format(f.number))print('We have {0} fruits'.format(f.get_number()))
출력 결과:
We have 100 fruitsWe have 200 fruits
4. 생성 방법
파이썬 클래스에는 생성 방법이라고 하는 __init__()라는 특수 메서드가 있습니다. 이 메서드는 클래스가 인스턴스화될 때 자동으로 호출됩니다. 클래스 속성 초기화 등에 사용됩니다. C++의 클래스 생성자와 유사합니다. def __init__(self):self.data = []
클래스는 __init__() 메서드를 정의하고, 클래스의 인스턴스화 작업은 자동으로 __init__() 메서드를 호출합니다.
class Fruit:def __init__(self): print('你已经实例化了一个对象') f = Fruit()
출력 결과
你已经实例化了一个对象
init_() 메소드는 매개변수를 가질 수 있으며 매개변수는 init()를 통해 클래스의 인스턴스화 작업에 전달됩니다.
class Complex:def __init__(self,real,image):self.r = realself.i = imagedef get_complex(self): print('complex real is %.2f , image is %.2f'%(self.r,self.i)) a = Complex(3.5,-3)a.get_complex()
출력 결과는 다음과 같습니다.
complex real is 3.50 , image is -3.00
self는 클래스가 아닌 클래스의 인스턴스를 나타냅니다. 클래스 메소드와 일반 함수 사이에는 단 하나의 특별한 차이점이 있습니다. 관례상 self라는 추가적인 첫 번째 매개변수 이름이 있어야 한다는 것입니다. 그러나 self는 Python의 키워드가 아닙니다.
이런 식으로 이해해도 되는지 궁금합니다. self는 클래스에 따라 객체를 인스턴스화한 후 객체의 주소를 나타냅니다. C++ 클래스의 이 포인터와 유사합니다.
class Test:def prt(self): print(self) print(self.__class__) t = Test()t.prt()
출력:
<__main__.Test object at 0x0000025EC6D45608><class '__main__.Test'>
5. 클래스 메서드
클래스 내부에서 def 키워드를 사용하여 메서드를 정의합니다. 일반적인 함수 정의와 달리 클래스 메서드에는 self가 포함되어야 합니다. , 첫 번째 매개변수입니다. 매개 변수를 전달하는 데 self가 필요하지 않은 경우 정적 메서드class Complex:def __init__(self, real=None, image=None):self.r = realself.i = image
def get_complex(self): print('complex real is %.2f , image is %.2f' % (self.r, self.i))
@staticmethoddef test(a, b): print('complex real is %.2f , image is %.2f' % (a, b))
a = Complex(3.5, -3)a.get_complex()
b = Complex()b.test(3, -2)
complex real is 3.50 , image is -3.00complex real is 3.00 , image is -3.00
6의 출력 결과를 나타내기 위해 함수 앞에 @staticmethod를 추가해야 합니다. Inheritance
Python은 클래스 상속도 지원합니다. 형식은 다음과 같습니다.class Derivedclassname(Baseclassname): ... ...
Baseclassname(기본 클래스 이름)은 파생 클래스와 동일한 범위에 정의되어야 합니다. 클래스 외에도 표현식을 사용할 수도 있는데, 이는 기본 클래스가 다른 모듈에 정의되어 있을 때 매우 유용합니다:
class Fruit: def __init__(self,sweet): self.sweetness = sweet def describe(self): print('Our fruit has a sweetness of %.2f'%self.sweetness) class Apple(Fruit):#单继承,继承fruit类 def __init__(self,sweet,color): self.color = color Fruit.__init__(self,sweet) def describe(self):#改写基类fruit的方法 print('Our apple has a sweetness of {0:.2f}%,and color is {1}'.format(self.sweetness,self.color)) apple = Apple(62.2,'red')apple.describe()
출력:
Our apple has a sweetness of 62.20%,and color is red
다중 상속
Python은 여러 기본 클래스를 상속할 수도 있습니다:
class Derivedclassname(basename1,basename2,...): ... ... ...
필요합니다 괄호 안의 상위 클래스 순서에 주의하세요. 상위 클래스에 동일한 메소드 이름이 있지만 하위 클래스에서 사용할 때 이를 지정하지 않은 경우 Python은 왼쪽에서 오른쪽으로 검색합니다. 하위 클래스에 없으면 상위 클래스를 왼쪽에서 오른쪽으로 검색합니다. 메서드가 포함되어 있습니까?
class Fruit:def __init__(self, sweet): self.sweetness = sweetdef describe(self): print('Our fruit has a sweetness of %.2f' % self.sweetness) class Food:def __init__(self, uprice, num): self.unit_price = uprice self.number = num self.total_price = num * upricedef cost(self): print('You need to pay {0:.3} yuan, thank you'.format(self.total_price)) class Apple(Fruit, Food):def __init__(self, sweet, color, uprice, num): self.color = color Fruit.__init__(self, sweet) Food.__init__(self, uprice, num)def describe(self): print('Our fruit has a sweetness of {0:.2f}%,and color is {1}'.format(self.sweetness, self.color))errree
출력:
Our fruit has a sweetness of 62.20%,and color is redYou need to pay 73.5 yuan, thank you
7、方法重写
如果父类方法的功能不能满足你的需求,你可以在子类重写你父类的方法,如果想调用已经被覆盖的基类方法,可以用super(子类名,子类实例对象名).父类方法
class Parent_class:def Method(self): print ('父类方法') class Child_class(Parent_class): # 定义子类def Method(self): print ('子类方法') c = Child_class() # 子类实例化c.Method() # 子类调用重写方法super(Child_class,c).Method() #用子类对象调用父类已被覆盖的方法
子类继承父类构造函数
如果在子类中需要父类的构造方法就需要显式地调用父类的构造方法,或者不重写父类的构造方法。
class A:def __init__(self, x, y): self.x = x self.y = y print('pos is ({0},{1})'.format(self.x, self.y)) def xxx(self): print('parent now') class B(A):def xxx(self): print('child now') b = B(10, 3)b.xxx()
输出
pos is (10,3)child now
如果重写了__init__ 时,实例化子类,就不会调用父类已经定义的 __init__。
如果重写了__init__ 时,要继承父类的构造方法,可以使用 super 关键字super(子类,self).__init__(参数1,参数2,....),或者父类名称.__init__(self,参数1,参数2,...)
8、类的私有属性
两个下划线开头,声明该属性为私有,像__name不能在类的外部被使用或直接访问。在类内部的方法中使用时 self.__name。
class JustCounter: __secretCount = 0 # 私有变量 publicCount = 0 # 公开变量 def count(self): self.__secretCount += 1 self.publicCount += 1 print(self.__secretCount) counter = JustCounter()counter.count()counter.count()print(counter.publicCount)print(counter.__secretCount) # 报错,实例不能访问私有变量
Traceback (most recent call last):File "test.py", line 16, in <module> print (counter.__secretCount) # 报错,实例不能访问私有变量AttributeError: 'JustCounter' object has no attribute '__secretCount'
两个下划线开头,声明该方法为私有方法,像__private_method,只能在类的内部调用 ,不能在类的外部调用。self.___private_method。
class Site:def __init__(self, name, url): self.name = name # public self.__url = url # private def who(self): print('name : ', self.name) print('url : ', self.__url) def __foo(self): # 私有方法 print('这是私有方法') def foo(self): # 公共方法 print('这是公共方法') self.__foo() x = Site('***', 'www.xxx.com')x.who() # 正常输出x.foo() # 正常输出x.__foo() # 报错
输出:
'''name : ***url : www.***.com这是公共方法这是私有方法Traceback (most recent call last): File "F:\Python\Program\test.py", line 61, in <module> x.__foo() # 报错AttributeError: 'Site' object has no attribute '__foo''''
类的专有方法
__init__ : 构造函数,在生成对象时调用,类似C++构造函数
__del__: 析构函数,释放对象时使用,类似C++析构函数,常用在释放申请的内存空间
__repr__: 打印,转换。这个个函数就是在打印类的时候,控制类输出的字符串
class Name:def __init__(self, name): self.name = name print(Name('s'))
'''<__main__.Name object at 0x0000023744AFD248>'''
class Name:def __init__(self,name): self.name = name def __repr__(self): #控制了在打印类时候的输出 return 'Name({!r})'.format(self.name) print(Name('s')) '''Name('s')'''
__setitem__ : 每当属性被赋值的时候都会调用该方法,因此不能再该方法内赋值 self.name = value 会死循环
__getitem__: 当访问不存在的属性时会调用该方法
__len__: 获得长度,如果一个类表现得像一个list,要获取有多少个元素,就得用len() 函数。要让len()函数工作正常,类必须提供一个特殊方法__len__(),它返回元素的个数。
class CountList:def __init__(self, *args): self.list = [x for x in args] self.count = self.__len__() def __len__(self): return len(self.list) def get_count(self): return self.count a = CountList(1, 2, 3, 4, 4, 5)print(a.get_count())print(len(a))
__cmp__: 比较运算
__call__: 函数调用
__add__: 加运算
__sub__: 减运算
class MyClass: def __init__(self, height, weight): self.height = height self.weight = weight # 两个对象的长相加,宽不变.返回一个新的类def __add__(self, others): return MyClass(self.height + others.height, self.weight + others.weight) # 两个对象的宽相减,长不变.返回一个新的类def __sub__(self, others): return MyClass(self.height - others.height, self.weight - others.weight) # 说一下自己的参数def intro(self): print("高为", self.height, " 重为", self.weight) def main(): a = MyClass(height=10, weight=5) a.intro() b = MyClass(height=20, weight=10) b.intro() c = b - a c.intro() d = a + b d.intro() if __name__ == '__main__': main()
'''高为 10 重为 5高为 20 重为 10高为 10 重为 5高为 30 重为 15'''
__mul__: 乘运算
__truediv__: 除运算
__mod__: 求余运算
__pow__: 乘方
同样的。类的专有方法也可以重写
위 내용은 Python 클래스를 사용하는 기본 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!