python metaprogramming
TRANSCRIPT
![Page 1: Python Metaprogramming](https://reader033.vdocuments.pub/reader033/viewer/2022042600/58d100e61a28abc00b8b6ff1/html5/thumbnails/1.jpg)
SÜLEYMAN DEMİREL ÜNİVERSİTESİSİBER GÜVENLİK LABORATUVARI
Python Metaprogramming
Mehmet GÜRDAL
![Page 2: Python Metaprogramming](https://reader033.vdocuments.pub/reader033/viewer/2022042600/58d100e61a28abc00b8b6ff1/html5/thumbnails/2.jpg)
Metaprogram
SDÜ-CYBERLAB Metaprogramming
Diğer programları tasarlayan, oluşturan, analiz eden okuyan ve dönüştüren, hatta çalışma esnasında kendini değiştiren program.
Development süresini kısaltır
Yazılan satır sayısını azatır
Esneklik katar
Program yeniliklere ve değişikliklere açık olur
![Page 3: Python Metaprogramming](https://reader033.vdocuments.pub/reader033/viewer/2022042600/58d100e61a28abc00b8b6ff1/html5/thumbnails/3.jpg)
Program
SDÜ-CYBERLAB Metaprogramming
class User:
def add(self, name):
return name
def delete(self, name):
return name
def update(self, name):
return name
def delete(self, name):
return name
.
.
![Page 4: Python Metaprogramming](https://reader033.vdocuments.pub/reader033/viewer/2022042600/58d100e61a28abc00b8b6ff1/html5/thumbnails/4.jpg)
![Page 5: Python Metaprogramming](https://reader033.vdocuments.pub/reader033/viewer/2022042600/58d100e61a28abc00b8b6ff1/html5/thumbnails/5.jpg)
Boss
SDÜ-CYBERLAB Metaprogramming
![Page 6: Python Metaprogramming](https://reader033.vdocuments.pub/reader033/viewer/2022042600/58d100e61a28abc00b8b6ff1/html5/thumbnails/6.jpg)
Log Işlemi
SDÜ-CYBERLAB Metaprogramming
import datetime, timeit
def add(self, name):
start = timeit.timeit()
try:
return name
finally:
stop = timeit.timeit()
print("{} fonksiyonu {} tarihinde çalıştırıldı ve {}sn sürdü".format(
"add",
datetime.date.today(),
start- stop
))..
.
![Page 7: Python Metaprogramming](https://reader033.vdocuments.pub/reader033/viewer/2022042600/58d100e61a28abc00b8b6ff1/html5/thumbnails/7.jpg)
Decorator
SDÜ-CYBERLAB Metaprogramming
Decorator
![Page 8: Python Metaprogramming](https://reader033.vdocuments.pub/reader033/viewer/2022042600/58d100e61a28abc00b8b6ff1/html5/thumbnails/8.jpg)
Decorator Kullanımı
SDÜ-CYBERLAB Metaprogramming
def log(func):
def wrapper(*args, **kwargs):
start = timeit.timeit()
try:
return func(*args, **kwargs)
finally:
stop = timeit.timeit()
print("{} fonksiyonu {} tarihinde çalıştırıldı ve {}sn sürdü.".format(
func.__qualname__,
datetime.date.today(),
start- stop
))
return wrapper
![Page 9: Python Metaprogramming](https://reader033.vdocuments.pub/reader033/viewer/2022042600/58d100e61a28abc00b8b6ff1/html5/thumbnails/9.jpg)
Decorator Kullanımı
SDÜ-CYBERLAB Metaprogramming
def log(func):
def wrapper(*args, **kwargs):
start = timeit.timeit()
try:
return func(*args, **kwargs)
finally:
stop = timeit.timeit()
print("{} fonksiyonu {} tarihinde çalıştırıldı ve {}sn sürdü".format(
func.__qualname__,
datetime.date.today(),
start- stop
))
return wrapper
Asıl fonksiyonu çalıştır ve oluşan değeri döndür
Eski fonksiyonun yerini tutacak bir fonksiyon tanımla
Olusturulan yeni fonksiyonu döndür
![Page 10: Python Metaprogramming](https://reader033.vdocuments.pub/reader033/viewer/2022042600/58d100e61a28abc00b8b6ff1/html5/thumbnails/10.jpg)
![Page 11: Python Metaprogramming](https://reader033.vdocuments.pub/reader033/viewer/2022042600/58d100e61a28abc00b8b6ff1/html5/thumbnails/11.jpg)
Decorator'e parametre ekleme
SDÜ-CYBERLAB Metaprogramming
def log(func=None, *, prefix=''):
if func is None: return partial(log, prefix=prefix)
@wraps(func)
def wrapper(*args, **kwargs):
start = timeit.timeit()
try:
return func(*args, **kwargs)
finally:
stop = timeit.timeit()
print("{}{} fonksiyonu {} tarihinde çalıştırıldı ve {}sn sürdü.".format(
prefix,
func.__qualname__,
datetime.date.today(),
start- stop
))
return wrapper
![Page 12: Python Metaprogramming](https://reader033.vdocuments.pub/reader033/viewer/2022042600/58d100e61a28abc00b8b6ff1/html5/thumbnails/12.jpg)
Decorator'e parametre ekleme
SDÜ-CYBERLAB Metaprogramming
def log(func=None, *, prefix=''):
if func is None: return partial(log, prefix=prefix)
@wraps(func)
def wrapper(*args, **kwargs):
start = timeit.timeit()
try:
return func(*args, **kwargs)
finally:
stop = timeit.timeit()
print("{}{} fonksiyonu {} tarihinde çalıştırıldı ve {}sn sürdü.".format(
prefix,
func.__qualname__,
datetime.date.today(),
start- stop
))
return wrapper
Func ile ilgili bilgileri wrapper'a aktar
![Page 13: Python Metaprogramming](https://reader033.vdocuments.pub/reader033/viewer/2022042600/58d100e61a28abc00b8b6ff1/html5/thumbnails/13.jpg)
Decorator'e parametre ekleme
SDÜ-CYBERLAB Metaprogramming
def log(func=None, *, prefix=''):
if func is None: return partial(log, prefix=prefix)
@wraps(func)
def wrapper(*args, **kwargs):
start = timeit.timeit()
try:
return func(*args, **kwargs)
finally:
stop = timeit.timeit()
print("{}{} fonksiyonu {} tarihinde çalıştırıldı ve {}sn sürdü.".format(
prefix,
func.__qualname__,
datetime.date.today(),
start- stop
))
return wrapper
Func ile ilgili bilgileri wrapper'a aktar
Eğer decorator, fonksiyon şeklinde
kullanılmadıysa fonksiyonmuş gibi çalıştır
![Page 14: Python Metaprogramming](https://reader033.vdocuments.pub/reader033/viewer/2022042600/58d100e61a28abc00b8b6ff1/html5/thumbnails/14.jpg)
Decorator'e parametre ekleme
SDÜ-CYBERLAB Metaprogramming
def log(func=None, *, prefix=''):
if func is None: return partial(log, prefix=prefix)
@wraps(func)
def wrapper(*args, **kwargs):
start = timeit.timeit()
try:
return func(*args, **kwargs)
finally:
stop = timeit.timeit()
print("{}{} fonksiyonu {} tarihinde çalıştırıldı ve {}sn sürdü.".format(
prefix,
func.__qualname__,
datetime.date.today(),
start- stop
))
return wrapper
Func ile ilgili bilgileri wrapper'a aktar
Eğer decorator, fonksiyon şeklinde
kullanılmadıysa fonksiyonmuş gibi çalıştır
![Page 15: Python Metaprogramming](https://reader033.vdocuments.pub/reader033/viewer/2022042600/58d100e61a28abc00b8b6ff1/html5/thumbnails/15.jpg)
Tekrar
SDÜ-CYBERLAB Metaprogramming
@log
def add(x, y):
return x + y
@log
def delete(x, y):
return x - y
@log(prefix="***")
def update(x, y):
return x * y
@log(prefix="***")
def get(x, y):
return x // y
TEKRAR!
![Page 16: Python Metaprogramming](https://reader033.vdocuments.pub/reader033/viewer/2022042600/58d100e61a28abc00b8b6ff1/html5/thumbnails/16.jpg)
Class Decorator
SDÜ-CYBERLAB Metaprogramming
def clslog(cls):
for key, val in vars(cls).items():
if callable(val):
setattr(cls, key, log(val))
return cls
@clslog
class User:
def add(self, name, passwd):
pass
![Page 17: Python Metaprogramming](https://reader033.vdocuments.pub/reader033/viewer/2022042600/58d100e61a28abc00b8b6ff1/html5/thumbnails/17.jpg)
![Page 18: Python Metaprogramming](https://reader033.vdocuments.pub/reader033/viewer/2022042600/58d100e61a28abc00b8b6ff1/html5/thumbnails/18.jpg)
Class Decorator
SDÜ-CYBERLAB Metaprogramming
def clslog(cls):
for key, val in vars(cls).items():
if callable(val):
setattr(cls, key, log(val))
return cls
@clslog
class User:
def add(self, name, passwd):
pass
Class'ı parametre olarak al
![Page 19: Python Metaprogramming](https://reader033.vdocuments.pub/reader033/viewer/2022042600/58d100e61a28abc00b8b6ff1/html5/thumbnails/19.jpg)
Class Decorator
SDÜ-CYBERLAB Metaprogramming
def clslog(cls):
for key, val in vars(cls).items():
if callable(val):
setattr(cls, key, log(val))
return cls
@clslog
class User:
def add(self, name, passwd):
pass
Class'ı parametre olarak al
Içerisinde tanımlı değişkenlere ve fonksiyonlara eriş
![Page 20: Python Metaprogramming](https://reader033.vdocuments.pub/reader033/viewer/2022042600/58d100e61a28abc00b8b6ff1/html5/thumbnails/20.jpg)
Class Decorator
SDÜ-CYBERLAB Metaprogramming
def clslog(cls):
for key, val in vars(cls).items():
if callable(val):
setattr(cls, key, log(val))
return cls
@clslog
class User:
def add(self, name, passwd):
pass
Class'ı parametre olarak al
Içerisinde tanımlı değerlere eriş
Eğer fonksiyonsa
Fonksiyonu loglanmış haliyle değiştir
![Page 21: Python Metaprogramming](https://reader033.vdocuments.pub/reader033/viewer/2022042600/58d100e61a28abc00b8b6ff1/html5/thumbnails/21.jpg)
Tekrar
SDÜ-CYBERLAB Metaprogramming
@clslog
class A:
pass
@clslog
class B:
pass
@clslog
class C:
pass
@clslog
class D:
pass
TEKRAR!
![Page 22: Python Metaprogramming](https://reader033.vdocuments.pub/reader033/viewer/2022042600/58d100e61a28abc00b8b6ff1/html5/thumbnails/22.jpg)
Tekrar
SDÜ-CYBERLAB Metaprogramming
@clslog
class A:
pass
@clslog
class B:
pass
@clslog
class C:
pass
@clslog
class D:
pass
TEKRAR!
![Page 23: Python Metaprogramming](https://reader033.vdocuments.pub/reader033/viewer/2022042600/58d100e61a28abc00b8b6ff1/html5/thumbnails/23.jpg)
Metaclasslar
SDÜ-CYBERLAB Metaprogramming
Metaclass
![Page 24: Python Metaprogramming](https://reader033.vdocuments.pub/reader033/viewer/2022042600/58d100e61a28abc00b8b6ff1/html5/thumbnails/24.jpg)
Metaclass
SDÜ-CYBERLAB Metaprogramming
a = 5
type(a) # int
type(int) # type
type(str) # type
type(object) # type
![Page 25: Python Metaprogramming](https://reader033.vdocuments.pub/reader033/viewer/2022042600/58d100e61a28abc00b8b6ff1/html5/thumbnails/25.jpg)
Metaclass
SDÜ-CYBERLAB Metaprogramming
# type('name', (), {}) name, bases, classdict
User = type('User', (object,), {'name':'mehmet', 'email':'@gmail.com'})
u = User()
u.name
'mehmet'
![Page 26: Python Metaprogramming](https://reader033.vdocuments.pub/reader033/viewer/2022042600/58d100e61a28abc00b8b6ff1/html5/thumbnails/26.jpg)
Metaclass
SDÜ-CYBERLAB Metaprogramming
class generic_type(type):
def __new__(cls, name, parents, clsdict):
clsobj = super().__new__(cls, name, parents, clsdict)
new = clslog(clsobj)
return new
class User(metaclass=generic_type):
.
.
.
![Page 27: Python Metaprogramming](https://reader033.vdocuments.pub/reader033/viewer/2022042600/58d100e61a28abc00b8b6ff1/html5/thumbnails/27.jpg)
![Page 28: Python Metaprogramming](https://reader033.vdocuments.pub/reader033/viewer/2022042600/58d100e61a28abc00b8b6ff1/html5/thumbnails/28.jpg)
Metaclass
SDÜ-CYBERLAB Metaprogramming
class generic_type(type):
def __new__(cls, name, parents, clsdict):
new = super().__new__(cls, name, parents, clsdict)
new = clslog(new)
return new
class User(metaclass=generic_type):
.
.
.
Class oluşturmak için gerekli bilgileri al
![Page 29: Python Metaprogramming](https://reader033.vdocuments.pub/reader033/viewer/2022042600/58d100e61a28abc00b8b6ff1/html5/thumbnails/29.jpg)
Metaclass
SDÜ-CYBERLAB Metaprogramming
class generic_type(type):
def __new__(cls, name, parents, clsdict):
new = super().__new__(cls, name, parents, clsdict)
new = clslog(new)
return new
class User(metaclass=generic_type):
.
.
.
Class oluşturmak için gerekli bilgileri al
Type'ı kullanarak yeni bir class oluştur
![Page 30: Python Metaprogramming](https://reader033.vdocuments.pub/reader033/viewer/2022042600/58d100e61a28abc00b8b6ff1/html5/thumbnails/30.jpg)
Metaclass
SDÜ-CYBERLAB Metaprogramming
class generic_type(type):
def __new__(cls, name, parents, clsdict):
new = super().__new__(cls, name, parents, clsdict)
new = clslog(new)
return new
class User(metaclass=generic_type):
.
.
.
Class oluşturmak için gerekli bilgileri al
Type'ı kullanarak yeni bir class oluştur
Oluşan class'ı loglanmış haliyle değiştir
![Page 31: Python Metaprogramming](https://reader033.vdocuments.pub/reader033/viewer/2022042600/58d100e61a28abc00b8b6ff1/html5/thumbnails/31.jpg)
Metaclass
SDÜ-CYBERLAB Metaprogramming
Metod
Class
Class Hiyerarşisi
Decorator
Class Decorator
Metaclass
![Page 32: Python Metaprogramming](https://reader033.vdocuments.pub/reader033/viewer/2022042600/58d100e61a28abc00b8b6ff1/html5/thumbnails/32.jpg)
![Page 33: Python Metaprogramming](https://reader033.vdocuments.pub/reader033/viewer/2022042600/58d100e61a28abc00b8b6ff1/html5/thumbnails/33.jpg)
Metaclass
SDÜ-CYBERLAB Metaprogramming
class User:
def __init__(self, name, email, age, passwd):
self.name = name
self.email = email
self.age = age
self.passwd = passwd
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
class Connection:
def __init__(self, user, hostname, port):
self.user = user
self.hostname = hostname
self.port = port
![Page 34: Python Metaprogramming](https://reader033.vdocuments.pub/reader033/viewer/2022042600/58d100e61a28abc00b8b6ff1/html5/thumbnails/34.jpg)
Metaclass
SDÜ-CYBERLAB Metaprogramming
class Struct:
_fields = []
def __init__(self, *args, **kwargs):
for key, value in zip(self._fields, args):
setattr(self, key, value)
class User(Struct):
_fields = ['name', 'email', 'age', 'passwd']
struct adında genel bir class tanımla
_fields değişkenleri tutacak
![Page 35: Python Metaprogramming](https://reader033.vdocuments.pub/reader033/viewer/2022042600/58d100e61a28abc00b8b6ff1/html5/thumbnails/35.jpg)
Metaclass
SDÜ-CYBERLAB Metaprogramming
class Struct:
_fields = []
def __init__(self, *args, **kwargs):
for key, value in zip(self._fields, args):
setattr(self, key, value)
class User(Struct):
_fields = ['name', 'email', 'age', 'passwd']
struct adında genel bir class tanımla
_fields değişkenleri tutacak
__init__'e parametre olarak girilenler ile
_fields listesindeki elemanları birleştirip
class'a değişken olarak ata
![Page 36: Python Metaprogramming](https://reader033.vdocuments.pub/reader033/viewer/2022042600/58d100e61a28abc00b8b6ff1/html5/thumbnails/36.jpg)
Metaclass
SDÜ-CYBERLAB Metaprogramming
u = User('mehmet', '@hotmail.com', 32, passwd='toor')
{'age': 32, 'email': '@hotmail.com', 'name': 'mehmet'}
?
![Page 37: Python Metaprogramming](https://reader033.vdocuments.pub/reader033/viewer/2022042600/58d100e61a28abc00b8b6ff1/html5/thumbnails/37.jpg)
Metaclass
SDÜ-CYBERLAB Metaprogramming
from inspect import Signature, Parameter
def make_signature(fields):
return Signature(Parameter(name, Parameter.POSITIONAL_OR_KEYWORD) for name in fields)
class Struct:
__signature__ = make_signature([])
def __init__(self, *args, **kwargs):
bound = self.__signature__.bind(*args, *kwargs)
for key, value in bound.arguments.items():
setattr(self, key, value)
class User(Struct):
__signature__ = make_signature(['name', 'email', 'age', 'passwd'])
u = User('mehmet', '@hotmail.com', age=32, passwd="toor")
![Page 38: Python Metaprogramming](https://reader033.vdocuments.pub/reader033/viewer/2022042600/58d100e61a28abc00b8b6ff1/html5/thumbnails/38.jpg)
![Page 39: Python Metaprogramming](https://reader033.vdocuments.pub/reader033/viewer/2022042600/58d100e61a28abc00b8b6ff1/html5/thumbnails/39.jpg)
Metaclass
SDÜ-CYBERLAB Metaprogramming
from inspect import Signature, Parameter
def make_signature(fields):
return Signature(Parameter(name, Parameter.POSITIONAL_OR_KEYWORD) for name in fields)
class Struct:
__signature__ = make_signature([])
def __init__(self, *args, **kwargs):
bound = self.__signature__.bind(*args, *kwargs)
for key, value in bound.arguments.items():
setattr(self, key, value)
class User(Struct):
__signature__ = make_signature(['name', 'email', 'age', 'passwd'])
u = User('mehmet', '@hotmail.com', age=32, passwd="toor")
Normal bir listeden Signature üret
![Page 40: Python Metaprogramming](https://reader033.vdocuments.pub/reader033/viewer/2022042600/58d100e61a28abc00b8b6ff1/html5/thumbnails/40.jpg)
Metaclass
SDÜ-CYBERLAB Metaprogramming
from inspect import Signature, Parameter
def make_signature(fields):
return Signature(Parameter(name, Parameter.POSITIONAL_OR_KEYWORD) for name in fields)
class Struct:
__signature__ = make_signature([])
def __init__(self, *args, **kwargs):
bound = self.__signature__.bind(*args, *kwargs)
for key, value in bound.arguments.items():
setattr(self, key, value)
class User(Struct):
__signature__ = make_signature(['name', 'email', 'age', 'passwd'])
u = User('mehmet', '@hotmail.com', age=32, passwd="toor")
Normal bir listeden Signature üret
Oluşturulan Signature'a fonksiyondaki
argümanları bağla
![Page 41: Python Metaprogramming](https://reader033.vdocuments.pub/reader033/viewer/2022042600/58d100e61a28abc00b8b6ff1/html5/thumbnails/41.jpg)
Metaclass
SDÜ-CYBERLAB Metaprogramming
from inspect import Signature, Parameter
def make_signature(fields):
return Signature(Parameter(name, Parameter.POSITIONAL_OR_KEYWORD) for name in fields)
class Struct:
__signature__ = make_signature([])
def __init__(self, *args, **kwargs):
bound = self.__signature__.bind(*args, *kwargs)
for key, value in bound.arguments.items():
setattr(self, key, value)
class User(Struct):
__signature__ = make_signature(['name', 'email', 'age', 'passwd'])
u = User('mehmet', '@hotmail.com', age=32, passwd="toor")
Normal bir listeden Signature üret
Oluşturulan Signature'a fonksiyondaki
argümanları bağla
Signature'daki parametrelerle oluşan
değişkenleri class'a ekle
![Page 42: Python Metaprogramming](https://reader033.vdocuments.pub/reader033/viewer/2022042600/58d100e61a28abc00b8b6ff1/html5/thumbnails/42.jpg)
Metaclass
SDÜ-CYBERLAB Metaprogramming
class User(Struct):
__signature__ = make_signature(['name', 'email', 'age', 'passwd'])
class Point(Struct):
__signature__ = make_signature(['x', 'y'])
class Connection(Struct):
__signature__ = make_signature(['user', 'hostname', 'port'])
![Page 43: Python Metaprogramming](https://reader033.vdocuments.pub/reader033/viewer/2022042600/58d100e61a28abc00b8b6ff1/html5/thumbnails/43.jpg)
Metaclass
SDÜ-CYBERLAB Metaprogramming
class User(Struct):
__signature__ = make_signature(['name', 'email', 'age', 'passwd'])
class Point(Struct):
__signature__ = make_signature(['x', 'y'])
class Connection(Struct):
__signature__ = make_signature(['user', 'hostname', 'port'])
Sadeleştirilebilir mi?
![Page 44: Python Metaprogramming](https://reader033.vdocuments.pub/reader033/viewer/2022042600/58d100e61a28abc00b8b6ff1/html5/thumbnails/44.jpg)
![Page 45: Python Metaprogramming](https://reader033.vdocuments.pub/reader033/viewer/2022042600/58d100e61a28abc00b8b6ff1/html5/thumbnails/45.jpg)
Metaclass
class struct_meta(type):
def __new__(cls, name, bases, clsdict):
clsobj = super().__new__(cls, name, bases, clsdict)
sign = make_signature(clsobj._fields)
setattr(clsobj, "__signature__", sign)
return clsobj
class Struct(metaclass=struct_meta):
_fields = [] #__sigature__ = make_signature([])
def __init__(self, *args, **kwargs):
bound = self.__signature__.bind(*args, *kwargs)
for key, value in bound.arguments.items():
setattr(self, key, value)
SDÜ-CYBERLAB Metaprogramming
![Page 46: Python Metaprogramming](https://reader033.vdocuments.pub/reader033/viewer/2022042600/58d100e61a28abc00b8b6ff1/html5/thumbnails/46.jpg)
Metaclass
class struct_meta(type):
def __new__(cls, name, bases, clsdict):
clsobj = super().__new__(cls, name, bases, clsdict)
sign = make_signature(clsobj._fields)
setattr(clsobj, "__signature__", sign)
return clsobj
class Struct(metaclass=struct_meta):
_fields = [] #__sigature__ = make_signature([])
def __init__(self, *args, **kwargs):
bound = self.__signature__.bind(*args, *kwargs)
for key, value in bound.arguments.items():
setattr(self, key, value)
SDÜ-CYBERLAB Metaprogramming
Class içindeki _fields listesinden
signature oluştur
![Page 47: Python Metaprogramming](https://reader033.vdocuments.pub/reader033/viewer/2022042600/58d100e61a28abc00b8b6ff1/html5/thumbnails/47.jpg)
Metaclass
class struct_meta(type):
def __new__(cls, name, bases, clsdict):
clsobj = super().__new__(cls, name, bases, clsdict)
sign = make_signature(clsobj._fields)
setattr(clsobj, "__signature__", sign)
return clsobj
class Struct(metaclass=struct_meta):
_fields = [] #__sigature__ = make_signature([])
def __init__(self, *args, **kwargs):
bound = self.__signature__.bind(*args, *kwargs)
for key, value in bound.arguments.items():
setattr(self, key, value)
SDÜ-CYBERLAB Metaprogramming
Class içindeki _fields listesinden
signature oluştur
Class'ın __signature__'ını yeni
signature ile değiştir
![Page 48: Python Metaprogramming](https://reader033.vdocuments.pub/reader033/viewer/2022042600/58d100e61a28abc00b8b6ff1/html5/thumbnails/48.jpg)
Metaclass
class struct_meta(type):
def __new__(cls, name, bases, clsdict):
clsobj = super().__new__(cls, name, bases, clsdict)
sign = make_signature(clsobj._fields)
setattr(clsobj, "__signature__", sign)
return clsobj
class Struct(metaclass=struct_meta):
_fields = [] #__sigature__ = make_signature([])
def __init__(self, *args, **kwargs):
bound = self.__signature__.bind(*args, *kwargs)
for key, value in bound.arguments.items():
setattr(self, key, value)
SDÜ-CYBERLAB Metaprogramming
Class içindeki _fields listesinden
signature oluştur
Class'ın __signature__'ını yeni
signature ile değiştir
![Page 49: Python Metaprogramming](https://reader033.vdocuments.pub/reader033/viewer/2022042600/58d100e61a28abc00b8b6ff1/html5/thumbnails/49.jpg)
Descriptor
SDÜ-CYBERLAB Metaprogramming
Descriptor
![Page 50: Python Metaprogramming](https://reader033.vdocuments.pub/reader033/viewer/2022042600/58d100e61a28abc00b8b6ff1/html5/thumbnails/50.jpg)
Metaclass
SDÜ-CYBERLAB Metaprogramming
class Descriptor:
def __init__(self, name=None):
self.name = name
def __set__(self, instance, value):
print("set", value)
def __delete__(self, instance):
print("del", self.name)
![Page 51: Python Metaprogramming](https://reader033.vdocuments.pub/reader033/viewer/2022042600/58d100e61a28abc00b8b6ff1/html5/thumbnails/51.jpg)
Metaclass
SDÜ-CYBERLAB Metaprogramming
class Descriptor:
def __init__(self, name=None):
self.name = name
def __set__(self, instance, value):
print("set", value)
def __delete__(self, instance):
print("del", self.name)
Manipüle edeceğimiz değişkeni tuttuk
![Page 52: Python Metaprogramming](https://reader033.vdocuments.pub/reader033/viewer/2022042600/58d100e61a28abc00b8b6ff1/html5/thumbnails/52.jpg)
Metaclass
SDÜ-CYBERLAB Metaprogramming
class Descriptor:
def __init__(self, name=None):
self.name = name
def __set__(self, instance, value):
print("set", value)
def __delete__(self, instance):
print("del", self.name)
Manipüle edeceğimiz değişkeni tuttuk
Değiştirme ve silme özelliklerini yeniden tasarladık
![Page 53: Python Metaprogramming](https://reader033.vdocuments.pub/reader033/viewer/2022042600/58d100e61a28abc00b8b6ff1/html5/thumbnails/53.jpg)
Metaclass
SDÜ-CYBERLAB Metaprogramming
class Descriptor:
def __init__(self, name=None):
self.name = name
def __set__(self, instance, value):
instance.__dict__[self.name]=value
def __delete__(self, instance):
del instance.__dict__[self.name]
class User(Struct):
_fields = ['name', 'email', 'age', 'passwd']
name = Descriptor('name')
email = Descriptor('email')
age = Descriptor('age')
passwd = Descriptor('passwd')
![Page 54: Python Metaprogramming](https://reader033.vdocuments.pub/reader033/viewer/2022042600/58d100e61a28abc00b8b6ff1/html5/thumbnails/54.jpg)
Metaclass
SDÜ-CYBERLAB Metaprogramming
class Typed(Descriptor):
ty = object
def __set__(self, instance, value):
if not isinstance(value, self.ty):
raise TypeError("Expected {}", self.ty)
return super().__set__(instance, value)
class Integer(Typed): ty = int
class String(Typed): ty = str
class Float(Typed): ty = float
![Page 55: Python Metaprogramming](https://reader033.vdocuments.pub/reader033/viewer/2022042600/58d100e61a28abc00b8b6ff1/html5/thumbnails/55.jpg)
Metaclass
SDÜ-CYBERLAB Metaprogramming
class Typed(Descriptor):
ty = object
def __set__(self, instance, value):
if not isinstance(value, self.ty):
raise TypeError("Expected {}", self.ty)
return super().__set__(instance, value)
class Integer(Typed): ty = int
class String(Typed): ty = str
class Float(Typed): ty = float
Descriptordaki __set__ metodunu ezdik
![Page 56: Python Metaprogramming](https://reader033.vdocuments.pub/reader033/viewer/2022042600/58d100e61a28abc00b8b6ff1/html5/thumbnails/56.jpg)
Metaclass
SDÜ-CYBERLAB Metaprogramming
class Typed(Descriptor):
ty = object
def __set__(self, instance, value):
if not isinstance(value, self.ty):
raise TypeError("Expected {}", self.ty)
return super().__set__(instance, value)
class Integer(Typed): ty = int
class String(Typed): ty = str
class Float(Typed): ty = float
Descriptordaki __set__ metodunu ezdik
Girilen değerin bizim belirlediğimiz tipte
olup olmadığını sorguladık.
![Page 57: Python Metaprogramming](https://reader033.vdocuments.pub/reader033/viewer/2022042600/58d100e61a28abc00b8b6ff1/html5/thumbnails/57.jpg)
Metaclass
SDÜ-CYBERLAB Metaprogramming
class User(Struct):
_fields = ['name', 'email', 'age', 'passwd']
name = String('name')
email = String('email')
age = Integer('age')
passwd = Integer('passwd')
![Page 58: Python Metaprogramming](https://reader033.vdocuments.pub/reader033/viewer/2022042600/58d100e61a28abc00b8b6ff1/html5/thumbnails/58.jpg)
Metaclass
SDÜ-CYBERLAB Metaprogramming
class User(Struct):
_fields = ['name', 'email', 'age', 'passwd']
name = String('name')
email = String('email')
age = Integer('age')
passwd = Integer('passwd')
![Page 59: Python Metaprogramming](https://reader033.vdocuments.pub/reader033/viewer/2022042600/58d100e61a28abc00b8b6ff1/html5/thumbnails/59.jpg)
Metaclass
SDÜ-CYBERLAB Metaprogramming
from collections import OrderedDict
class struct_meta(type):
@classmethod
def __prepare__(cls, name, bases):
return OrderedDict()
def __new__(cls, clsname, bases, clsdict):
fields = [key for key, val in clsdict.items()
if isinstance(val, Descriptor)]
for name in fields:
clsdict[name].name = name
clsobj = super().__new__(cls, clsname, bases, dict(clsdict))
sign = make_signature(fields)
setattr(clsobj, "__signature__", sign)
return clsobj
![Page 60: Python Metaprogramming](https://reader033.vdocuments.pub/reader033/viewer/2022042600/58d100e61a28abc00b8b6ff1/html5/thumbnails/60.jpg)
Metaclass
SDÜ-CYBERLAB Metaprogramming
from collections import OrderedDict
class struct_meta(type):
@classmethod
def __prepare__(cls, name, bases):
return OrderedDict()
def __new__(cls, clsname, bases, clsdict):
fields = [key for key, val in clsdict.items()
if isinstance(val, Descriptor)]
for name in fields:
clsdict[name].name = name
clsobj = super().__new__(cls, clsname, bases, dict(clsdict))
sign = make_signature(fields)
setattr(clsobj, "__signature__", sign)
return clsobj
![Page 61: Python Metaprogramming](https://reader033.vdocuments.pub/reader033/viewer/2022042600/58d100e61a28abc00b8b6ff1/html5/thumbnails/61.jpg)
Metaclass
SDÜ-CYBERLAB Metaprogramming
from collections import OrderedDict
class struct_meta(type):
@classmethod
def __prepare__(cls, name, bases):
return OrderedDict()
def __new__(cls, clsname, bases, clsdict):
fields = [key for key, val in clsdict.items()
if isinstance(val, Descriptor)]
for name in fields:
clsdict[name].name = name
clsobj = super().__new__(cls, clsname, bases, dict(clsdict))
sign = make_signature(fields)
setattr(clsobj, "__signature__", sign)
return clsobj
Class oluşturulurken kullanılan sözlüğü üreten metod
![Page 62: Python Metaprogramming](https://reader033.vdocuments.pub/reader033/viewer/2022042600/58d100e61a28abc00b8b6ff1/html5/thumbnails/62.jpg)
Metaclass
SDÜ-CYBERLAB Metaprogramming
from collections import OrderedDict
class struct_meta(type):
@classmethod
def __prepare__(cls, name, bases):
return OrderedDict()
def __new__(cls, clsname, bases, clsdict):
fields = [key for key, val in clsdict.items()
if isinstance(val, Descriptor)]
for name in fields:
clsdict[name].name = name
clsobj = super().__new__(cls, clsname, bases, dict(clsdict))
sign = make_signature(fields)
setattr(clsobj, "__signature__", sign)
return clsobj
Class oluşturulurken kullanılan sözlüğü üreten metod
Descriptor tipinde tanımlı değişkenlerden
signiture oluştururken kullandığımız fields'I
oluştur
![Page 63: Python Metaprogramming](https://reader033.vdocuments.pub/reader033/viewer/2022042600/58d100e61a28abc00b8b6ff1/html5/thumbnails/63.jpg)
Metaclass
SDÜ-CYBERLAB Metaprogramming
from collections import OrderedDict
class struct_meta(type):
@classmethod
def __prepare__(cls, name, bases):
return OrderedDict()
def __new__(cls, clsname, bases, clsdict):
fields = [key for key, val in clsdict.items()
if isinstance(val, Descriptor)]
for name in fields:
clsdict[name].name = name
clsobj = super().__new__(cls, clsname, bases, dict(clsdict))
sign = make_signature(fields)
setattr(clsobj, "__signature__", sign)
return clsobj
Class oluşturulurken kullanılan sözlüğü üreten metod
Descriptor tipinde tanımlı değişkenlerden
signiture oluştururken kullandığımız fields'I
oluştur
name = String('name')
![Page 64: Python Metaprogramming](https://reader033.vdocuments.pub/reader033/viewer/2022042600/58d100e61a28abc00b8b6ff1/html5/thumbnails/64.jpg)
Metaclass
SDÜ-CYBERLAB Metaprogramming
class User(Struct):
name = String()
email = String()
age = Integer()
passwd = Integer()
class Point(Struct):
x = Float()
y = Float()
class Connection(Struct):
user = String()
hostname = String()
port = Integer()
![Page 65: Python Metaprogramming](https://reader033.vdocuments.pub/reader033/viewer/2022042600/58d100e61a28abc00b8b6ff1/html5/thumbnails/65.jpg)
Metaclass
SDÜ-CYBERLAB Metaprogramming
Teşekkürler
Soru - Cevap